从firefox捕获错误事件消息

时间:2013-02-23 01:59:36

标签: javascript events firefox throw

我找不到在firefox下捕获错误消息的方法:

window.addEventListener("error", handleException, false);

...

function handleException(e) {   
    alert(e);
    return false;
}

...

<script>
throw new Error('sdasd');
</script>

这很好地输入了handleException方法,但e参数是firefox 下的error event,我不知道如何获取相关消息 。 例如,在chrome中,我通过e.message获得消息,因为在错误冒泡到未被捕获之后,在窗口级别触发了自动错误(请参阅this fiddle:最终错误是“未捕获” )包含我手动提出的原始错误。

所以在firefox下有相同的行为(如果你在firefox下运行小提琴你会看到消息是“未定义”)我找到了一个解决方法,包括一个错误提升函数来设置手册“最后一个错误”架构:

function err(I_sText) { 
    g_lastManualError = new Error(I_sText);
    throw g_lastManualError; //this variable is global so I can get the message from anywhere
}

因此,我只调用throw new Error(..)而不是err(..)。这是有效的,至少对于用户定义的异常,这是我最关心的问题。在我的处理程序handleException中,我正在咨询全局变量。

你知道我怎么办?我对这个解决方案不满意。

谢谢你, S上。

1 个答案:

答案 0 :(得分:1)

我修改了你的代码作为演示:

function handleException(e) { 
    console.log(e);
    alert(e);
    return false;
}
window.addEventListener("error", handleException, false);

try {
  throw new Error('sdasd');
}
catch (e) {
  console.log(e)
}
console.log('after exception 1');
throw new Error('foo');
console.log('after exception 2');

运行此代码(在Firebug中)向我展示了这一点:

Error: sdasd
[Break On This Error]   

Filtered chrome url chrome://firebug/content/console/commandLineExposed.js

comman...osed.js (line 175)
<System>

after exception 1

"Error: foo `    throw new Error('foo');` @14"

如果您尝试捕获错误,请使用try {...} catch { ...}。看起来你只是绑定到一个错误事件,所以你抛出的异常仍会传播到窗口并告诉JS引擎停止。在Chrome中运行此代码,您会看到您从未看到“异常2之后”,但您会看到“异常1之后”。

异常(由throw创建)的目的是停止代码执行,除非有代码处理该特定异常。您可以在MDN page for try-catch

上查看示例

编辑:我刚想到您可能正在尝试捕获jQuery错误事件。如果是这种情况,您的事件绑定是正确的,但您不应该使用throw

进行测试

编辑2 :我应该早点注意到这一点,但您正在尝试使用window.addEventListener侦听DOM错误事件。错误事件不会中断执行。例外。

使用以下代码替换代码throw new Error('sdasd');

var customEvent = new CustomEvent('error')

window.dispatchEvent(customEvent);

那应该可以解决你的问题。我使用the MDN page on custom events作为参考。