2017-06-01 23 views
0

以下腳本可讓您運行一段JavaScript代碼。 try/catch塊會捕獲錯誤。何處獲取EVAL中引發的異常

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請求中拋出的異常?

+0

除此之外,它不會趕上一個因爲它是一個回調函數,所以'success'函數是個例外。直到退出try/catch後,纔會調用該代碼。 –

+0

這不是關於在ajax請求中添加錯誤回調嗎? – Huangism

+0

@MattBurland 100%同意 - 但這是我的問題... – itsame69

回答

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); 
 
    } 
 

 
})();

從沒有使用`eval`可言,即使你不使用它,你有一個'試/ catch`塊內部的功能
+0

thx很多這個! – itsame69