2008-12-04 93 views
31

我正在尋找記錄未處理的JavaScript異常。發生異常時沒有發生事件嗎?我正在尋找在瀏覽器中導致javascript錯誤之前捕獲異常,但我寧願不在try/catch中運行我的整個應用程序。任何幫助,將不勝感激。謝謝!Javascript是否觸發未處理/未捕獲異常的事件?

更新: tvanfosson指出恐怖的可能性。它不是規範的一部分,只能在基於IE或Gecko的瀏覽器中使用。

欲瞭解更多信息 - http://books.google.com/books?id=tKszhx-XkzYC&pg=PA386&lpg=PA386&dq=safari+onerror+javascript&source=web&ots=gQaGbpUnjG&sig=iBCtOQs0aH_EAzSbWlGa9v5flyo#PPA387,M1

的OnError支持表 - http://www.quirksmode.org/dom/events/error.html

Mozilla的文檔 - https://developer.mozilla.org/en/DOM/window.onerror

WebKit的錯誤報告 - https://bugs.webkit.org/show_bug.cgi?id=8519

回答

8

嘗試使用onerror的處理程序。來自MDN的Docs。這將允許你在檢測到錯誤時執行某些操作,但可能不會讓你以優雅的方式繼續執行try/catch塊。請注意,瀏覽器之間的差異無疑是如何處理的。

+0

謝謝 - 這似乎工作正常 – 2008-12-04 21:54:29

32

看看這個小提琴:

http://jsfiddle.net/xYsRA/1/

window.onerror = function (msg, url, line) { 
    console.log("Caught[via window.onerror]: '" + msg + "' from " + url + ":" + line); 
    return true; // same as preventDefault 
}; 

window.addEventListener('error', function (evt) { 
    console.log("Caught[via 'error' event]: '" + evt.message + "' from " + evt.filename + ":" + evt.lineno); 
    console.log(evt); // has srcElement/target/etc 
    evt.preventDefault(); 
}); 


throw new Error("Hewwo world. I crash you!!!"); 

throw new Error("Hewwo world. I can only crash you once... :("); 

它打印:

Caught[via window.onerror]: 'Uncaught Error: Hewwo world. I crash you!!!' from http://fiddle.jshell.net/xYsRA/1/show/:32 fiddle.jshell.net:21 
Caught[via 'error' event]: 'Uncaught Error: Hewwo world. I crash you!!!' from http://fiddle.jshell.net/xYsRA/1/show/:32 fiddle.jshell.net:26 
ErrorEvent {lineno: 32, filename: "http://fiddle.jshell.net/xYsRA/1/show/", message: "Uncaught Error: Hewwo world. I crash you!!!", clipboardData: undefined, cancelBubble: false…} 
fiddle.jshell.net:27\ 

注:

  • 如果刪除了 「返回true」/「 evt.preventDefault()」行,那麼在記錄錯誤之後,它將以正常方式在JS控制檯上進行打印。

  • 與上述語句相反,window.onerror在我測試過的所有瀏覽器中都有效。然而,addEventListener方法反而可能更好,並提供更豐富的語義。