我试图捕获用户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。)
编辑:首先总结答案到目前为止。最重要的是这两者之间的区别(只有第二个在Chrome中提供了追溯):
throw "some error"
throw Error("some error")
现在问题的另一半。捕获了哪些错误。例如,我在控制台中得到了这个,但它从未到达我上面的错误处理程序。为什么? (这是来自IndexedDB,使用idb.js)
Uncaught (in promise) DOMException: Key already exists in the object store.
你可能需要抛出一个错误:)
throw new Error("test error")
好的,那个html文件似乎工作正常:
<html>
<body>
<script>
window.addEventListener('error', (e) => {
console.log(e);
});
setTimeout(() => { throw 'Hello world'; }, 1000);
</script>
</body>
</html>
这应该输出适当的错误到控制台。但是,当我尝试直接在DevTools控制台中设置处理程序并在超时处理程序中抛出错误时,我收到“脚本错误”。在后一种情况下,Chrome似乎认为它是同一起源政策违规。