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

时间:2019-03-15 08:42:20

标签: javascript promise onerror

我想使用onerror截获并记录我的JavaScript应用程序中发生的所有错误。除使用promises或async函数外,这可以按预期工作。

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

2 个答案:

答案 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);
})

希望这会有所帮助!