3

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

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

...

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

...

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

这很好地输入了handleException方法,但是e参数是error event在 firefox 下,我不知道如何获取关联的消息。例如,在 chrome 中,我得到了消息,e.message因为在错误冒泡到没有被捕获之后,在窗口级别触发了一个自动错误(参见这个小提琴:最终错误是“未捕获”),其中包含我的原始错误手动升起。

因此,为了在 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
}

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

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

谢谢你,S。

4

1 回答 1

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 页面上查看 try-catch的示例

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

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

用以下代码替换您的throw new Error('sdasd');代码:

var customEvent = new CustomEvent('error')

window.dispatchEvent(customEvent);

那应该可以解决您的问题。我使用自定义事件的 MDN 页面作为参考。

于 2013-02-23T05:34:32.187 回答