我正在尝试捕获用户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);
});它起作用了吗?嗯,也许吧,但不是我想的那样。例如,尝试从控制台执行此操作时,在警报弹出窗口中未显示"test error“,而是"Script error":
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.发布于 2017-12-21 21:39:11
您可能需要抛出一个错误:)
throw new Error("test error")发布于 2017-12-21 22:13:06
好的,这个html文件看起来工作得很好:
<html>
<body>
<script>
window.addEventListener('error', (e) => {
console.log(e);
});
setTimeout(() => { throw 'Hello world'; }, 1000);
</script>
</body>
</html>这应该会将正确的错误输出到控制台。但是,当我尝试在DevTools控制台中直接设置处理程序,并在超时处理程序中抛出错误时,我得到‘脚本错误。’。在后一种情况下,Chrome似乎认为这是违反同源策略。
https://stackoverflow.com/questions/47926040
复制相似问题