【问题标题】:How can I trigger global onError handler via native Promise when runtime error occurs? [duplicate]发生运行时错误时,如何通过本机 Promise 触发全局 onError 处理程序? [复制]
【发布时间】:2017-01-15 13:15:13
【问题描述】:

有了Q.js,我可以使用.done() 触发window.onerror

window.onerror = function() {
    console.log('error from handler');
}
var q = Q('initValue').then(function (data) {
    throw new Error("Can't do something and use promise.catch method.");
});
q.catch(function(error){
    throw new Error("This last exception will trigger window.onerror handler via done method.");
})
.done();

在原生 Promise (ES6) 中我们没有 .done(),最后一个 ".catch" 是链的结尾:

var p = new Promise(function () {
    throw new Error("fail");
});
p.catch(function (error) {
    throw new Error("Last exception in last chain link");
});

"throw new Error(...)" in ".catch" 是重现运行时错误的最简单方法之一。实际上,它可能是运行时错误的另一种模拟(EvalError、SyntaxError、TypeError 等),例如:

var a = [];
a(); // Uncaught TypeError: a is not a function

.done 用法是一个示例,可以更详细地解释我的目标。我没有复制 .done API 的目标。

我的任务是:我在 window.onerror 上有一个 Promise 链和处理程序。我可以通过 .cath 处理链中的所有错误,但链末尾的运行时错误除外。当任何运行时异常发生在 Promise 的方法链末尾时,我需要在 window.onerror 上挂起的触发处理程序。

限制:只有原生JS,必须使用window.onerror

通过本机 Promise 触发此全局处理程序的最佳方式是什么?

【问题讨论】:

  • .then() 处理程序在其中捕获异常并将它们变成被拒绝的承诺。因此,您不能抛出异常并期望它一路走上 ES6 标准承诺的最高级别。
  • 您不需要自己触发任何全局错误事件。只需为 unhandledPromiseRejection 注册您的错误处理程序!
  • 不确定,也许Catch all unhandled javascript promise rejections 是一个更好的欺骗目标。
  • "必须使用 window.onerror." - 为什么?你不能用window.onunhandledrejection= window.onerror吗?
  • @A.Mikhailov 最好是 .catch(window.onerror) - 传递错误,不会导致额外的未处理拒绝。

标签: javascript promise q es6-promise globalevent


【解决方案1】:

异步抛出错误:

window.addEventListener('error', function() {
  console.log('error from handler');
});
new Promise(function () {
  throw new Error("fail");
}).catch(function (error) {
  setTimeout(() => {throw new Error("Last exception in last chain link")}, 0);
});

【讨论】:

  • 为什么不直接删除catch 并简单地为适当的事件注册错误处理程序?
  • @Bergi 我刚刚从问题中复制了catch,我也会将其删除。关于未处理的 Promise 拒绝事件,是否已经支持?
  • Oriol,Bergi:非常感谢您的帮助!我详细说明了问题和描述。我浏览了所有推荐链接,但没有找到这个问题的答案。请你再看看更新的问题,请
  • @Oriol,你也是对的!适用于我的请求,添加异步抛出的catch:.catch(function (error) { var a = []; a(); // error in last logic chain link }).catch(function (error) { setTimeout(function () {throw error}, 0); });
猜你喜欢
  • 1970-01-01
  • 2011-01-03
  • 2013-08-31
  • 1970-01-01
  • 2010-10-17
  • 1970-01-01
  • 1970-01-01
  • 2013-12-09
  • 1970-01-01
相关资源
最近更新 更多