2009-12-25 47 views
12

我正在嘗試在生產性網站上記錄javascript錯誤。到目前爲止,它相當奏效與包含在該網站下面的代碼:在javascript中使用堆棧跟蹤記錄錯誤

function catcherr(errorMessage, url, line) { 
    var parameters = "msg=" + escape(errorMessage) 
      + "&url=" + escape(url) 
      + "&line=" + escape(line); 

    new Image().src = "/error.gif?" + parameters; 

    return false; 
}; 

window.onerror = catcherr; 

我試圖堆棧跟蹤添加到錯誤,以獲取更多信息。這基本上適用於以下想法,包括到上面的功能:

try { i.dont.exist += 0; } // does not exist - that's the point 
    catch (e) 
    { 
      if (e.stack) // Firefox 
      { 
       // do some stuff 

使用jQuery,一個簡單的例子:

<script type="text/javascript"> 
jQuery(document).ready(function() { 
    p.foo += 1; // this should throw an error 
    // do stuff 
}); 
</script> 

有趣的是,當我有裏面的「準備一個錯誤「jquery的功能,」try {i.dont.exist + = 0;}「部分不會拋出任何異常,並且引擎停止時沒有任何錯誤。 通過上面的例子,catcherr如下擴展,只有「1」被警告:有一個想法

function catcherr(errorMessage, url, line) { 
    try { alert(1); i.dont.exist += 0; alert(4);} catch(e) { alert(5);} 
    alert(2); 
    var parameters = "msg=" + escape(errorMessage) 
    // ... 
} 

任何人爲什麼會破裂,當jQuery的的「準備就緒」功能內出現錯誤?

回答

1

很可能jQuery將回調包裝在自己的try/catch中,並忽略錯誤。

+0

我不這麼認爲,因爲如果我刪除函數catcherr()中的try {},則會引發錯誤。 – 2ni 2009-12-25 20:25:03

8

我不知道爲什麼你有這個問題(它看起來很奇怪,我不認爲它是JQuery吃你的例外的問題,因爲你的alert(1)不會被解僱),但我做了想要提及您使用Error.stack - 當調用onerror事件時,您沒有原始錯誤的堆棧上下文,因此在此時獲取堆棧跟蹤(通過捕獲自己的錯誤)不會產生有意義的堆棧。

但是回到真正的答案 - 不是通過編寫特定的破解代碼來模擬問題,以便您可以捕獲錯誤,那麼直接拋出錯誤怎麼樣?在你的onerror處理程序中的第一行可能是:

try { throw new Error("dummy"); } catch (e) { alert(e.stack); } 

這是有效的代碼,這將更有可能給你造成的問題。

0

嘗試try/catch中的其他異常。 like a = 1/0或baddarr [5] ='bad',看看是否會觸發異常。 有時候「對象未找到」錯誤可能是對象未被加載的結果,並且可能有不同於其他異常的處理。

+0

nope,沒有變化 – 2ni 2010-02-24 15:24:47

+0

然後不確定。非常神祕。你看過jQuery文件中的異常處理嗎? – funkymushroom 2010-03-02 22:06:46