2012-02-20 64 views
4

的問題是沒有得到普遍的調用堆棧,可以如下描述進行調用堆棧: http://eriwen.com/javascript/js-stack-trace/ 而是在訪問觸發事件調用堆棧,從事件的處理程序。獲取導致錯誤

特別是我很感興趣,從窗口錯誤事件

window.onerror = function(msg, url, line) { 
//callstack // would be nice to have. 
//log callstack or whatever. (note this can be done w/ ajax and service, and is not the question at hand. 
} 

記錄調用堆棧,但我不知道如何記錄錯誤。 (我使用jQuery的.ajax和服務)

將瀏覽器實現這一點永遠不會消失?目前可能嗎?也許我正在做這個錯誤的方式。如何添加一個簡單的函數(即不修改我的代碼庫中的所有函數)來檢測何時出現錯誤,並記錄調用堆棧。

感謝到目前爲止和抱歉,如果這個問題是措辭不當初步的答案。

回答

7

Error對象在Mozilla上有一個非標準的stack屬性,它似乎也可以在Google Chrome中工作,而不是IE9。

function test() { 
    try {//can't think of anything that causes an exception? 
     throw new Error("boo"); 
    } 
    catch(e) 
    { 
     alert(e.stack); 
    } 
} 
test();​ 

見小提琴: - 「登錄調用堆棧或任何」 http://jsfiddle.net/Cq5RJ/

+1

更多信息:https://開頭的Bugzilla .mozilla.org/show_bug.cgi?ID = 355430 – 2012-02-20 17:29:08

+0

+1正要張貼一個try/catch將是你最好的選擇。 – Bot 2012-02-20 17:35:47

+0

但我怎樣才能嘗試/捕捉每一個功能?我想我可以修改Function.prototype以便以某種方式包裝在try catch塊中? – user420667 2012-02-20 17:43:34

0

這在很大程度上取決於你想要調用堆棧做的那是什麼,你的意思是什麼

出於安全原因,這顯然不太可能,瀏覽器將永遠不會允許一個網頁給一個javascript指令寫在本地計算機的硬盤上的任意文件。

,你可以採用以下幾種可能:

  1. 建立在JavaScript調用堆棧,並把它作爲一個詳細的錯誤信息可擴展標記語言處理程序的服務器,你可以保存在日誌文件中的錯誤上。 (假設你至少在服務器上有一些cgi訪問)

  2. 使用console.log()寫入callstack到javascript控制檯,假設有問題的瀏覽器支持它。 (在寫入之前,請務必測試控制檯和console.log的存在。)

  3. 將callstack寫入隱藏的div,您可以使用瀏覽器的開發人員工具對其進行調整。

  4. 打印在警報調用堆棧()。 (這是作爲一個開發者可能有用,但它是高度侵入到最終用戶,這樣你就不會想離開的最終部署的代碼的警報。)

+0

感謝您的全面回覆。我認爲伐木對我來說不是問題。問題在於獲取該堆棧。日誌記錄將通過您的建議1(ajax和webservice)執行。不過謝謝。 – user420667 2012-02-20 17:42:12

+0

特別是,獲取調用棧不是問題,它是從事件處理程序獲取觸發事件之前發生的調用棧。 – user420667 2012-02-20 17:45:23