【发布时间】: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