为什么 onerror 不拦截来自 promises 和 async 函数的异常

Why does onerror not intercept exceptions from promises and async functions

我想使用 onerror 拦截并记录我的 JavaScript 应用程序中发生的所有错误。这按预期工作,除非使用 promises 或异步函数。

在下面的片段中,fail 抛出的异常按预期被拦截,但 rejectPromisethrowAsync 不是调用 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);
})

希望对您有所帮助!!