Dimana MENANGKAP PENGECUALIAN yang dilemparkan dalam EVAL

Skrip berikut memungkinkan Anda menjalankan sepotong kode javascript. Kesalahan ditangkap oleh blok coba/tangkap.

    try {
        var result = eval(script);
    } catch (e) {
        // do something meaningful
    }

Namun, jika variabel script berisi misalnya panggilan AJAX, dan panggilan ajax ini memunculkan pengecualian (misalnya dalam fungsi sukses), pengecualian ini TIDAK akan ditangkap oleh blok coba/tangkap ini...

    // execute an AJAX request
        var script = '$.ajax(url:"/somewhere", success: function(){throw new MyException('testexception')})';
    try {
        var result = eval(script);
    } catch (e) {
        // will not be triggered...
    }

Pertanyaan: bagaimana cara menangkap pengecualian yang diberikan dalam permintaan ajax?


person itsame69    schedule 01.06.2017    source sumber
comment
Selain tidak menggunakan eval sama sekali, meskipun Anda tidak menggunakannya dan Anda memiliki fungsi tersebut di dalam blok try/catch, fungsi tersebut tidak akan menangkap pengecualian dari fungsi success karena ini adalah panggilan balik. Kode itu tidak akan dipanggil sampai Anda keluar dari try/catch   -  person Matt Burland    schedule 01.06.2017
comment
Bukankah ini tentang menambahkan panggilan balik kesalahan dalam permintaan ajax?   -  person Huangism    schedule 01.06.2017
comment
@MattBurland 100% setuju - tapi itu pertanyaan saya...   -  person itsame69    schedule 01.06.2017
comment
@Huangisme no. menurutku tidak.   -  person itsame69    schedule 01.06.2017
comment
Jawaban singkatnya adalah Anda harus menangkap pengecualian dalam panggilan balik di panggilan balik   -  person Matt Burland    schedule 01.06.2017
comment
coba tambahkan ke ajax async:false   -  person Dani    schedule 01.06.2017
comment
jQuery sudah tidak lagi menggunakan async: false. api.jquery.com/jquery.ajax   -  person idream1nC0de    schedule 01.06.2017
comment
@MattBurland oke, Matt... Terima kasih atas bantuan Anda!   -  person itsame69    schedule 01.06.2017
comment
@ Itsame69 Lihat jawaban saya di bawah untuk satu perspektif dalam menangani masalah ini.   -  person idream1nC0de    schedule 01.06.2017
comment
@Dani/Jacob Maaf, tapi ini bukan solusi   -  person itsame69    schedule 01.06.2017


Jawaban (1)


Saya harap Anda sadar akan bahaya penggunaan eval, dan jika tidak, ada banyak artikel bagus di luar sana yang menjelaskan mengapa ini bukan ide bagus.

Meskipun demikian, masalahnya adalah callback sukses dipanggil setelah blok catch. Anda harus menambahkan blok try/catch dalam callback sukses, atau Anda harus menangani kesalahan dari perspektif yang lebih global. Satu ide yang terpikir oleh saya untuk melakukan ini adalah menggunakan window.onerror. Saya memiliki contoh di bawah ini yang menunjukkan sesuatu yang mirip dengan masalah Anda, dan contoh yang menunjukkan Anda dapat menangkap kesalahan yang terjadi di eval.

(function() {

  'use strict';

  window.addEventListener('error', e => console.log(`window.onerror: ${e.message}`));

  let script = `setTimeout(function() {
    throw new Error('Whoops!');
  }, 0);`;

  eval(script);

  script = `throw new Error('Whoops!');`;

  try {
    eval(script);
  } catch (e) {
    console.log(e.message);
  }

})();

person idream1nC0de    schedule 01.06.2017