我试图在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 script和stracktracejs和我的实现是启发通过它,我会考虑使用caller.callee
回退,但我宁愿。不是因为我不能获取文件和行号。
你知道一个更好的解决方案?
我可以在try-catch语句中包装可疑的调用,但我不知道在获取实际错误之前是否有可疑的调用,然后我将修复代码,以免它再次丢失。
我可以捕捉异常并重新抛出new Error(e.message)
,但后来我又丢失了堆栈跟踪。
在Firefox中,'e.toString()'似乎给出了一个堆栈跟踪。实际的属性看起来是'e.location',但是在访问时会引发错误。 – pimvdb
太棒了!我会研究这个。 - 'e.location'似乎提供了一个适当填充的'caller.callee'。 – Halcyon
虽然格式完全不同。你想达到什么目的?如果那是你想要的,我猜你也可以重新抛出“抛出e”。 – pimvdb