2012-11-06 116 views
1

我試圖在JavaScript中生成一個堆棧跟蹤。我有一個在Chrome中運行得非常好的實現,但是Firefox中存在一個問題:像DOMException這樣的本機異常沒有.stack屬性。DOMException在Chrome中有堆疊,但在Firefox中沒有堆疊

<div id="test"></div> 
<script type="text/javascript"> 
try { 
    var range = document.createRange(); 
    range.setStart(document.getElementById("test"), -1); // throws Exception 
} catch (e) { 
    console.log(e.stack); 
} 
</script> 

這會在Chrome中給Error: Index or size was negative, or greater than the allowed value. at http://test/test.html:5:8

但在Firefox,我得到undefined - 傷心FAIS :(

我知道Eriwen's stacktrace scriptstracktracejs和我的實現是啓發通過它,我會考慮使用caller.callee回退,但我寧願。不是因爲我不能獲取文件和行號。

你知道一個更好的解決方案?


我可以在try-catch語句中包裝可疑的調用,但我不知道在獲取實際錯誤之前是否有可疑的調用,然後我將修復代碼,以免它再次丟失。

我可以捕捉異常並重新拋出new Error(e.message),但後來我又丟失了堆棧跟蹤。

+2

在Firefox中,'e.toString()'似乎給出了一個堆棧跟蹤。實際的屬性看起來是'e.location',但是在訪問時會引發錯誤。 – pimvdb

+0

太棒了!我會研究這個。 - 'e.location'似乎提供了一個適當填充的'caller.callee'。 – Halcyon

+0

雖然格式完全不同。你想達到什麼目的?如果那是你想要的,我猜你也可以重新拋出「拋出e」。 – pimvdb

回答

0

我試過e.location但這樣做的結果是known bug in FirefoxError: Permission denied for <file://> to create wrapper for object of class UnnamedClass

I can access e.filename and e.lineNumber。這是我現在正在使用的解決方案。