我想使用onerror截获并记录我的JavaScript应用程序中发生的所有错误。除使用promises或async函数外,这可以按预期工作。
在下面的片段中,fail
引发的异常按预期被拦截,但是rejectPromise
和throwAsync
而不是调用onerror处理程序总是在控制台中显示Uncaught (in promise) Error
吗?
我如何始终在使用promise和异步功能的代码库中拦截所有错误?
window.onerror = function(message, source, lineno, colno, error) {
console.log('onerror handler logging error', message);
return true;
}
function rejectPromise() {
return Promise.reject(new Error('rejected promise'));
}
async function throwAsync() {
throw new Error('async exception');
}
function fail() {
throw new Error('exception');
}
rejectPromise().then(() => console.log('success'));
throwAsync();
fail();
答案 0 :(得分:4)
您可以为onunhandledrejection
添加一个窗口处理程序,因为未处理的Promise拒绝与错误并不完全相同。在您的浏览器控制台中检查以下代码片段的结果(不是代码片段控制台,它在显示大对象时会出现问题):
window.onerror = function(message, source, lineno, colno, error) {
console.log('onerror handler logging error', message);
return true;
}
window.onunhandledrejection = function(message, source, lineno, colno, error) {
console.log('onunhandledrejection handler logging error', message);
return true;
}
function rejectPromise() {
return Promise.reject(new Error('rejected promise'));
}
async function throwAsync() {
throw new Error('async exception');
}
function fail() {
throw new Error('exception');
}
rejectPromise().then(() => console.log('success'));
throwAsync();
fail();
答案 1 :(得分:1)
您可以添加addEventListener
来解决此问题,因为throw new Exception()
将引发错误事件。因此fail()
将引发error
事件
window.addEventListener("error", function (e) {
alert("Error occurred: " + e.error.message);
return false;
})
window.addEventListener('unhandledrejection', function (e) {
alert("Error occurred: " + e.reason.message);
})
希望这会有所帮助!