捕获所有未处理的javascript承诺拒绝

Catch all unhandled javascript promise rejections

本文关键字:javascript 承诺 拒绝 未处理      更新时间:2023-09-26

我想捕获在javascript承诺中发生的所有未处理的异常/拒绝。有没有一种很好的方法来捕捉它们,而不需要在承诺链的每一端添加.catch(..) ?(如果忘记添加这个,错误会自动消失)。

Google Chrome中的开发者控制台可以记录它们,我也喜欢在生产环境中记录它们。

对于正常的javascript异常,我使用window.onerror函数,但是来自Promise的错误调用这个函数。

的例子:

window.onerror = function (e) {
    alert("unhandled error: " + e);
};
var p = new Promise(function (resolve, reject) {
    var nullObject = null;
    // Raise a TypeError: Cannot read property 'forceNullError' of null
    var x = nullObject.forceNullError(); 
    resolve();
});
p.then(function () { alert('success'); });

JSFiddle: https://jsfiddle.net/f7zwej6L/

*)我注意到WinJS有一个.done(..)方法我想要的,但原生承诺没有。

全世界都在等待unhandledrejectionrejectionhandled事件。截至2016年3月,Chrome现在是第一个支持它的。

的例子:

window.addEventListener('unhandledrejection', function(event) {
    console.error('Unhandled rejection (promise: ', event.promise, ', reason: ', event.reason, ').');
});

规范:HTML生活标准

Mozilla开发人员:onrejectionhandled, onunhandledrejection

Chromium issue: 495801,393913

请注意,在Node中事件被称为unhandledRejection:

process.on('unhandledRejection', function(err, promise) {
    console.error('Unhandled rejection (promise: ', promise, ', reason: ', err, ').');
});

在12+版本中,节点将在这些拒绝时终止。

一些库有自己的api来做这件事。有些浏览器迟早会报告未处理的拒绝。

实际上,done可能不做你想要的。这就是为什么它不是规范的一部分。在任何情况下,你仍然要记住调用它。

没有可靠的、跨平台的、跨库的方法来做到这一点。

uncaught库可以帮助您捕获未处理的承诺拒绝。

它也处理未捕获的错误。

编辑

<script type="text/javascript" src=".../uncaught/lib/index.js"></script>
<script type="text/javascript">
    uncaught.start();
    uncaught.addListener(function (error) {
        console.log('Uncaught error or rejection: ', error.message);
    });
</script>
这种方法的好处是只有一个接口,它允许您处理未捕获的错误和未处理的承诺拒绝。