【发布时间】:2012-11-06 13:36:44
【问题描述】:
我正在尝试在 JavaScript 中生成堆栈跟踪。我有一个在 Chrome 中运行良好的实现,但在 Firefox 中存在一个问题:像 DOMExceptions 这样的原生异常没有.stack 属性。
<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 - 悲伤的事实 :(
我知道Eriwen's stacktrace script 和stracktracejs,我的实现受到了它的启发。我会考虑使用caller.callee 后备,但我不想这样做,因为我无法获取文件和行号。
您知道更好的解决方案吗?
我可以将可疑调用包装在 try-catch 语句中,但在得到实际错误之前我不知道调用是否可疑,然后我将修复代码,使其永远不会再次抛出。
我可以捕获异常并作为new Error(e.message) 重新抛出,但随后我也丢失了堆栈跟踪。
【问题讨论】:
-
在 Firefox 中,
e.toString()似乎提供了堆栈跟踪。实际属性似乎是e.location,但访问时会引发错误。 -
太棒了!我会调查一下。 -
e.location似乎提供了一个正确填充的caller.callee。 -
格式却完全不同。你想达到什么目的?我想你也可以重新抛出
throw e如果这是你想要的。 -
e.location当我在 Firebug 中查看它时,它看起来像我需要的东西,但是当我尝试使用console.log(e.location);时,我得到了Error: Permission denied for <file://> to create wrapper for object of class UnnamedClass。这似乎是一个与安全相关的错误..什么? bugzilla.mozilla.org/show_bug.cgi?id=436953
标签: javascript firefox dom stack stack-trace