【问题标题】:Why does onerror not intercept exceptions from promises and async functions为什么 onerror 不拦截来自 Promise 和异步函数的异常
【发布时间】:2019-08-06 07:08:49
【问题描述】:

我想使用 onerror 来拦截和记录我的 JavaScript 应用程序中发生的所有错误。除了使用 Promise 或异步函数时,这可以按预期工作。

在下面的截图中,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();

【问题讨论】:

  • 为此,Promise 有第二个参数,即拒绝函数处理程序,可以通过在 Promise 上使用 .catch() 来处理。这意味着 Promise 已经使用 try/catch

标签: javascript promise onerror


【解决方案1】:

您可以为onunhandledrejection 添加一个窗口处理程序,因为未处理的 Promise 拒绝与错误并不完全相同。在您的浏览器控制台中检查以下 sn-p 的结果(不是 sn-p 控制台,尝试显示大对象时会出现问题):

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();

【讨论】:

    【解决方案2】:

    您可以添加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);
    })
    

    希望对你有帮助!!

    【讨论】:

      猜你喜欢
      • 2022-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-13
      • 1970-01-01
      • 2021-02-15
      • 2019-04-12
      • 2016-06-24
      相关资源
      最近更新 更多