捕获错误,错误事件

时间:2017-12-21 13:29:19

标签: javascript error-handling try-catch throw

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

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

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。)

而且,一个相当重要的事情:只需添加此处理程序,我会捕获哪些错误? ASYNCH?承诺?等

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

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

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

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

2 个答案:

答案 0 :(得分:1)

您可能需要抛出错误:)

 throw new Error("test error")

答案 1 :(得分:1)

好的,那个html文件似乎工作正常:

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

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

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