【问题标题】:catching error event message from firefox从 Firefox 捕获错误事件消息
【发布时间】:2013-02-08 18:40:49
【问题描述】:

我在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 下运行 fiddle,你会看到消息是“未定义”)我找到了一种解决方法,包括封装一个错误引发函数来设置手动“最后一个错误”架构:

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
}

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

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

谢谢你, S.

【问题讨论】:

  • e.message 不适合你?
  • 显然 Firefox 缺少该属性。
  • @ExplosionPills 不,它没有,但在 chrome 下它可以

标签: javascript events firefox throw


【解决方案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 { ...}。看起来你只是绑定到一个错误事件,所以你抛出的异常仍然会传播到 window 并告诉 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 作为参考。

【讨论】:

  • 谢谢埃里克。感谢您指出错误并没有停止传播。这仅在 FF 下发生,错误处理程序中的 return false 在 chrome 中完成这项工作。我在 FF 中添加了一个事件取消,并且错误不再冒泡。但是,我仍然不知道如何从handleException 方法中获取错误消息。
  • 我认为你混淆了两件事。有错误 events 就像 jQuery 将触发的那些。然后是 Javascript exceptions 用于停止代码执行。它们的处理方式不同——你想和哪一个一起工作?
  • 当一个意外错误被抛出,或者我自愿抛出它时,我今天用这个方法很好地捕捉到了一切(这很完美,一切都通过我的处理程序)。但是,firefox 没有给我事件信息,来自自定义异常或来自窗口的错误事件。
  • @Sebas 您帖子中的代码是一个 错误事件 处理程序。它不捕获异常。 Firefox 没有给您消息,因为您正在抛出异常,而不是触发错误事件。查看我的编辑。
  • 我的事件处理程序在使用throw 时也可以工作(不要问我为什么,这实际上是一个好问题)。问题是捕获的错误事件没有属性。我尝试了你的建议,它确实引发了一个 CustomEvent 并进入了异常处理程序。但是问题是一样的,填充 detail 字段,它没有在处理程序中提供。非常感谢您的帮助。
猜你喜欢
  • 2011-12-23
  • 1970-01-01
  • 2014-09-03
  • 1970-01-01
  • 2016-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
相关资源
最近更新 更多