2012-11-06 73 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。这是我现在正在使用的解决方案。