抓住所有未处理的javascript承诺拒绝

时间:2015-07-17 09:22:33

标签: javascript es6-promise

我想抓住在javascript Promise中发生的所有未处理的异常/拒绝。是否有一种很好的方法来捕获它们而不在Promise链的每一端添加.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(..)方法,但Native Promises没有。

4 个答案:

答案 0 :(得分:72)

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

示例:

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

规格:HTML Living Standard

Mozilla开发者: onrejectionhandledonunhandledrejection

Chromium问题:495801393913

答案 1 :(得分:17)

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

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

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

答案 2 :(得分:3)

有些库有自己的API来执行此操作。有些浏览器会报告未处理的拒绝(迟早)。

实际上,done可能做你想做的事。这就是为什么它不是规范的一部分。无论如何,你仍然要记得打电话。

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

答案 3 :(得分:1)

uncaught library可以帮助你捕捉未经处理的拒绝承诺。

它也处理未被捕获的错误。

修改

<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>

这种方法的好处是唯一的一个界面,它允许您处理未捕获的错误和未处理的拒绝承诺。