为什么 onerror 不拦截来自 promises 和 async 函数的异常
Why does onerror not intercept exceptions from promises and async functions
我想使用 onerror 拦截并记录我的 JavaScript 应用程序中发生的所有错误。这按预期工作,除非使用 promises 或异步函数。
在下面的片段中,fail
抛出的异常按预期被拦截,但 rejectPromise
和 throwAsync
不是调用 onerror 处理程序,而是始终在 Uncaught (in promise) Error
中显示控制台?
我如何始终拦截使用承诺和异步函数的代码库中的所有错误?
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();
您可以为 onunhandledrejection
添加 window 处理程序,因为未处理的 Promise 拒绝与错误不完全相同。在您的 浏览器控制台 中检查以下代码段的结果(不是代码段控制台,它会在尝试显示大对象时出现问题):
window.onerror = function(message, source, lineno, colno, error) {
console.log('onerror handler logging error', message);
return true;
}
window.onunhandledrejection = function(errorEvent) {
console.log('onunhandledrejection handler logging error', errorEvent);
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();
您可以添加 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);
})
希望对您有所帮助!!
我想使用 onerror 拦截并记录我的 JavaScript 应用程序中发生的所有错误。这按预期工作,除非使用 promises 或异步函数。
在下面的片段中,fail
抛出的异常按预期被拦截,但 rejectPromise
和 throwAsync
不是调用 onerror 处理程序,而是始终在 Uncaught (in promise) Error
中显示控制台?
我如何始终拦截使用承诺和异步函数的代码库中的所有错误?
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();
您可以为 onunhandledrejection
添加 window 处理程序,因为未处理的 Promise 拒绝与错误不完全相同。在您的 浏览器控制台 中检查以下代码段的结果(不是代码段控制台,它会在尝试显示大对象时出现问题):
window.onerror = function(message, source, lineno, colno, error) {
console.log('onerror handler logging error', message);
return true;
}
window.onunhandledrejection = function(errorEvent) {
console.log('onunhandledrejection handler logging error', errorEvent);
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();
您可以添加 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);
})
希望对您有所帮助!!