จะจับข้อยกเว้นที่เกิดขึ้นได้ที่ไหนใน EVAL

สคริปต์ต่อไปนี้ช่วยให้คุณสามารถเรียกใช้โค้ดจาวาสคริปต์ได้ ข้อผิดพลาดกำลังถูกจับได้โดยบล็อก try / catch

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

อย่างไรก็ตาม หากตัวแปร script มีอินสแตนซ์ของการเรียก AJAX และการเรียก ajax นี้ส่งข้อยกเว้น (เช่น ในฟังก์ชันความสำเร็จ) ข้อยกเว้นนี้จะไม่ถูกตรวจจับโดยบล็อก try / catch นี้...

    // 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...
    }

คำถาม: ฉันจะตรวจจับข้อยกเว้นที่เกิดขึ้นภายในคำขอ ajax ได้อย่างไร


person itsame69    schedule 01.06.2017    source แหล่งที่มา
comment
นอกเหนือจากการไม่ใช้ eval เลย แม้ว่าคุณจะไม่ได้ใช้งานและคุณมีฟังก์ชันนั้นอยู่ในบล็อก try/catch ก็จะไม่ตรวจพบข้อยกเว้นจากฟังก์ชัน success เนื่องจากเป็นการเรียกกลับ รหัสนั้นจะไม่ถูกเรียกจนกว่าคุณจะออกจาก try/catch   -  person Matt Burland    schedule 01.06.2017
comment
นี่ไม่เกี่ยวกับการเพิ่มการเรียกกลับข้อผิดพลาดในคำขอ ajax หรือไม่   -  person Huangism    schedule 01.06.2017
comment
@MattBurland เห็นด้วย 100% - แต่นั่นคือคำถามของฉัน...   -  person itsame69    schedule 01.06.2017
comment
@ฮวงนิยม # อย่าคิดอย่างนั้น   -  person itsame69    schedule 01.06.2017
comment
คำตอบสั้น ๆ ก็คือคุณจะต้องจับข้อยกเว้นในการโทรกลับ ในการโทรกลับ   -  person Matt Burland    schedule 01.06.2017
comment
ลองเพิ่ม ajax async:false   -  person Dani    schedule 01.06.2017
comment
jQuery เลิกใช้แล้ว async: false api.jquery.com/jquery.ajax   -  person idream1nC0de    schedule 01.06.2017
comment
@MattBurland โอเค Matt... ขอบคุณสำหรับความช่วยเหลือของคุณ!   -  person itsame69    schedule 01.06.2017
comment
@ itsame69 ดูคำตอบของฉันด้านล่างสำหรับมุมมองหนึ่งในการจัดการกับปัญหานี้   -  person idream1nC0de    schedule 01.06.2017
comment
@Dani/Jacob ขออภัย แต่นี่ไม่ใช่วิธีแก้ปัญหา   -  person itsame69    schedule 01.06.2017


คำตอบ (1)


ฉันหวังว่าคุณจะตระหนักถึงอันตรายของการใช้ eval และหากไม่มีบทความดีๆ มากมายที่อธิบายว่าทำไมจึงไม่ใช่ความคิดที่ดี

ดังที่กล่าวไปแล้ว ปัญหาก็คือว่าการเรียกกลับสำเร็จนั้นถูกเรียกหลังจากบล็อก catch คุณจะต้องเพิ่มบล็อก try/catch ภายในการเรียกกลับที่สำเร็จ หรือคุณจะต้องจัดการกับข้อผิดพลาดจากมุมมองที่เป็นสากลมากขึ้น แนวคิดหนึ่งที่ฉันคิดได้ว่าจะทำสิ่งนี้คือการใช้ window.onerror ฉันมีตัวอย่างด้านล่างที่แสดงสิ่งที่คล้ายกับปัญหาของคุณ และตัวอย่างที่แสดงว่าคุณสามารถตรวจพบข้อผิดพลาดที่เกิดขึ้นใน 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