【问题标题】:Catching errors, the onerror event捕获错误,onerror 事件
【发布时间】:2018-06-04 04:40:12
【问题描述】:

我正在尝试捕捉用户网络浏览器中发生的错误。我希望用户发送错误的屏幕截图,可能包括文件、行号等。

我希望它现在会相当简单和标准化。但我想知道。经过反复试验,我想出了这个:

window.addEventListener('error', function (e) {
    console.log(e);
    let error = e;
    if (e.error) error = e.error;
    let msg = "There was an error.";
    msg += " Please go to https://somewhere.com/";
    msg += " and post an image of this message. \n\nError: ";
    if (error.message) {
        msg += error.message;
    } else {
        msg += error;
    }
    if (error.stack) msg += "\n\n"+error.stack;
    console.log(msg);
    alert(msg);
});

有效吗?嗯,也许吧,但不像我预期的那样。例如,从控制台尝试这个并没有在警报弹出窗口中给我“测试错误”,而是“脚本错误”:

setTimeout(function(){throw "test error"}, 1000)

我该怎么做? (我目前只对较新的浏览器感兴趣,实际上只对 Chrome 感兴趣。以后可能会使用 Firefox 和 Edge。)

还有一件相当重要的事情:通过添加这个处理程序,我会捕获哪些错误?异步?承诺?等等。

编辑:首先总结到目前为止的答案。最重要的是这两者之间的区别(Chrome 中只有第二个给出了回溯):

throw "some error"
throw Error("some error")

现在讨论问题的另一半。捕获了哪些错误。例如,我在控制台中得到了这个,但它从来没有到达我上面的错误处理程序。为什么? (这是来自 IndexedDB,使用 idb.js)

Uncaught (in promise) DOMException: Key already exists in the object store.

【问题讨论】:

  • @SergeK。谢谢,它可能有用,但对我测试的案例没有帮助。如果我查看 ev.view 和 ev.detail(正如预期的那样,这当然不是 UIEvent)。而且 Event 的规范没有给出任何细节。
  • 呃,ev.view 和 ev.detail 是未定义的(我不知何故从上面的评论中删除了它)。

标签: javascript error-handling try-catch throw


【解决方案1】:

你可能需要抛出一个错误:)

 throw new Error("test error")

【讨论】:

【解决方案2】:

好的,该 html 文件似乎可以正常工作:

<html>
<body>
    <script>
        window.addEventListener('error', (e) => {
            console.log(e);
        });

        setTimeout(() => { throw 'Hello world'; }, 1000);
    </script>
</body>
</html>

这应该将正确的错误输出到控制台。但是,当我尝试直接在 DevTools 控制台中设置处理程序并在超时处理程序中引发错误时,我收到“脚本错误”。在后一种情况下,Chrome 似乎认为这是违反同源政策的行为。

【讨论】:

  • 是的,已确认。正如乔纳斯 W 指出的那样,如果您执行“抛出错误(...)”,您将获得更多信息(回溯)。
猜你喜欢
  • 2017-03-27
  • 1970-01-01
  • 2018-03-25
  • 1970-01-01
  • 1970-01-01
  • 2014-10-07
  • 1970-01-01
  • 2013-02-08
相关资源
最近更新 更多