2011-08-17 40 views
42

Javascript有這個偉大的回調window.onerror。跟蹤任何錯誤非常方便。但是,它會調用錯誤名稱,文件名和行。它肯定不像獲得try...catch聲明中的實際錯誤對象那麼豐富。 實際的錯誤對象包含更多的數據,所以我試圖去解決這個問題。不幸的是,當您開始使用異步代碼時,try...catch語句無法正常工作。用window.onerror獲取實際的Javascript錯誤對象

有沒有辦法結合並獲得兩全其美?我最初尋找一種方法來獲得在塊內觸發的最後錯誤,但它看起來像JS不存儲該錯誤。

任何線索?

+0

趕上錯誤覆蓋像setTimeout和setInveral的功能,把一個嘗試catch循環內他們。你將能夠捕捉到所有的錯誤。合理 ? –

回答

10

如果您指的是錯誤對象的堆棧跟蹤,那麼AFAIK,這是不可能的。

簡單的原因是堆棧跟蹤與運行時異常(最終用try ... catch ...處理)相關的執行上下文被創建或拋出(使用new Error()throw)。

而調用window.onerror時,它會在不同的上下文中調用。

您可以在onerror處理程序獲得通過檢查window.event一些里程(不適用於FF)。

+3

當。堆棧跟蹤實際上是我正在尋找的東西之一:/不知道我明白爲什麼這不能以某種方式「堅持」,因爲它是一個字符串數組雖然... –

+0

它不是持久的,因爲範圍在它的創建不再存在。在try/catch的情況下,你仍然在_that_範圍內。 – Mrchief

+1

看看這個:http://helephant.com/2007/05/12/diy-javascript-stack-trace/可能有助於你的情況,但不知道。 – Mrchief

46

這現在可以在一些瀏覽器中使用。 spec已更新,以包含stacktrace的實際錯誤作爲第5個參數。

問題是,不是每個瀏覽器支持這個呢,所以你可以做這樣的事情:

window.onerror = function(message, filename, lineno, colno, error) 
{ 
    if(error != null) 
    { 
     //handle the error with stacktrace in error.stack 
    } 
    else 
    { 
     //sadly only 'message', 'filename' and 'lineno' work here 
    } 
}; 
+0

會不會有一個很好的方法來將這個錯誤傳遞給ng-app中包含的angular.js服務? – FutuToad

+4

至少適用於Chrome,IE11和Firefox> = 31。我還沒有測試Safari和移動版本。似乎現在得到很好的支持。 – frank

+0

@ user2151819好消息 – SuperUberDuper

5

現代瀏覽器完全支持HTML 5規範草案ErrorEventwindow.onerror。在這兩種這些瀏覽器您可以使用window.onerror,或(令人驚訝!)結合「錯誤」事件正確的:

// Only Chrome & Opera pass the error object. 
window.onerror = function (message, file, line, col, error) { 
    console.log(message, "from", error.stack); 
}; 
// Only Chrome & Opera have an error attribute on the event. 
window.addEventListener("error", function (e) { 
    console.log(e.error.message, "from", e.error.stack); 
}); 
相關問題