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

标签 javascript promise onerror

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

在下面的片段中,fail 抛出的异常按预期被拦截,但是 rejectPromisethrowAsync 总是显示一个控制台中未捕获( promise )错误

我如何始终拦截使用 promises 和异步函数的代码库中的所有错误?

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 添加一个窗口处理程序,因为未处理的 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();

关于javascript - 为什么 onerror 不拦截来自 promises 和 async 函数的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55178612/

相关文章:

node.js - 未处理的PromiseRejection警告: Insufficient funds

javascript - Promise.all 具有不同的返回类型

javascript - Chrome 找出哪个外部脚本导致 "Script Error."

javascript - 带变量的 Thymeleaf 内联 JavaScript 表达式

javascript - 使用 Javascript 验证复选框

javascript - 检查 Javascript 是否存在滚动条?

javascript - 使用 onError 两次

javascript - 如果数组中不存在日期,如何插入日期

javascript - 如何从拉取的 mongodb 文档中添加字段

error-handling - 错误时转到[标签]在VBA中不起作用