2013-10-02 59 views
3

我正在考慮處理JavaScript運行時錯誤與window.onerrortry{...} catch(e){...}塊。處理與window.onerror和try-catch塊的錯誤之間的差異

https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers.onerror狀態:

Note that some/many error events do not trigger window.onerror, you have to listen for them specifically.

似乎都window.onerrortry{...} catch(e){...}可以處理的ReferenceError:http://jsfiddle.net/7RARf/

而且,兩者都不能處理的SyntaxError的:http://jsfiddle.net/UXVs2/

從處理明顯區別

除了錯誤使用window.onerror並使用like處理它們try{...} catch(e){...},try-catch允許我們優雅地處理錯誤,重新拋出錯誤等等,而window.onerror函數不會,等等。在處理錯誤的兩種方式之間還存在哪些其他差異?有沒有可以用window.onerror處理的錯誤,但是try{...} catch(e){...}不能處理?反之亦然?

回答

1

是的 - window.onerror可以檢測由瀏覽器工作流程造成的錯誤 - try/catch只在有限的部分執行js代碼。 window.onerror可能會檢測到插件問題或由於不嚴格代碼而導致的任何錯誤(像jQ,API等YT API等庫) - 例如:您不能將外部庫支持的異步代碼嘗試(無需修改外部代碼) ,你不能把腳本加載完成的HTML標籤嘗試(它由瀏覽器管理) - window.onerror將觸發時,腳本文件被損壞,無法加載標籤 - window.onerror引發更多的錯誤比catch能夠支持 - 也包含有關文件和行的信息。缺點是window.onerror只給出了信息 - 代碼被中斷,使用try/catch語句可以提供備用行爲,並允許代碼來處理情況 - 即使有錯誤

你可以使用try/catch語句捕捉語法錯誤但只有當你正在評估代碼形式的字符串:

try{ 
    eval('(function(){asdhaowd;;;;asd;[email protected]#[email protected]$lolzolololol]]]]]]]})()'); 
} catch(e){ 
    do sth(); 
} 

它會趕上的eval錯誤(意外「]」或之前的東西) 我用它在我的網站上檢測由用戶上傳的受損代碼。 window.onerror僅適用於調試 - 它不能防止代碼崩潰,當嘗試可以

+0

如果您嘗試 - 你可能會期望發生錯誤 - window.onerror是有用的跟蹤代碼中的意外錯誤 - 例如。您可以將函數發送錯誤報告綁定到您的郵件 – Lapsio