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

捕获所有未处理的javascript承诺拒绝,javascript,es6-promise,Javascript,Es6 Promise,我希望捕获javascript承诺中发生的所有未处理的异常/拒绝。在承诺链的每一端都不添加.catch(..)的情况下,是否有一种捕获它们的好方法?(如果忘记添加此项,错误将自动消失) Google Chrome中的开发者控制台可以记录它们,我也喜欢在生产环境中记录它们 对于正常的javascript异常,我使用window.onerror函数,但是来自承诺的错误调用此函数 例如: window.onerror = function (e) { alert("unhandled erro

我希望捕获javascript承诺中发生的所有未处理的异常/拒绝。在承诺链的每一端都不添加
.catch(..)
的情况下,是否有一种捕获它们的好方法?(如果忘记添加此项,错误将自动消失)

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

对于正常的javascript异常,我使用
window.onerror
函数,但是来自承诺的错误调用此函数

例如:

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'); });
window.addEventListener('unhandledrejection', function(event) {
    console.error('Unhandled rejection (promise: ', event.promise, ', reason: ', event.reason, ').');
});
JSFiddle:


*)我注意到WinJS有一个
.done(..)
方法来满足我的需求,但本机承诺没有。一些库有自己的API来实现这一点。某些浏览器会报告未经处理的拒绝(迟早)

实际上,
done
可能并不能满足您的需求。这就是为什么它不是规范的一部分。在任何情况下,您仍然必须记住调用它


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

全世界都在等待
未处理的退出
拒绝处理
事件。截至2016年3月,Chrome现在是第一个支持它的公司

例如:

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'); });
window.addEventListener('unhandledrejection', function(event) {
    console.error('Unhandled rejection (promise: ', event.promise, ', reason: ', event.reason, ').');
});
规格:

Mozilla开发者: ,

铬问题:,

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

它还处理未捕获的错误

编辑

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

uncaught.start();
uncaught.addListener(函数(错误){
console.log('未捕获错误或拒绝:',error.message);
});

这种方法的好处是只有一个接口,它允许您处理未处理的错误和未处理的承诺拒绝。

注意,在节点中,事件称为
未处理的拒绝

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

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

.done
相当于
.then(done,done)其中
完成
是一些功能-因此没有重大损失there@JaromandaX谢谢你的回复。我在MSDN上发现了这一点:“then函数中未处理的异常会作为承诺状态的一部分被静默捕获,但done函数中未处理的异常会被抛出。”。不,
。done
并不等同于
。then(done,done)
。看,它似乎已经在Chromium的主干中,Firefox也真的想要实现它。我想它很快就会上市。编辑它,将事件名称改为“unhandledrejection”,并提到Chrome现在支持它(woot!)。“window.onUnhandlerRejection”是属性version.FYI。对于任何使用Bluebird的人,都会触发
unhandlerRejection
事件,但承诺和原因嵌套在事件的
detail
键下(例如
event.detail.promise
而不是
event.promise
)。见奇。对我来说,它只在启用“捕获异常时暂停”时调用这些函数。表示在Chrome 49+、Chrome for Android 70+、iOS Safari 11.3+、UC Browser for Android 11.8+、Safari 11+、Opera 36+、三星Internet 5+、Android Browser 67+中受支持。但它基于相同的
unhandledrejection
事件,所以受支持的浏览器是:谷歌Chrome 49+、Opera 41+、Yandex.Browser 16+。是的,你说得对。这种方法的基础并没有什么特别之处。它只简化了
unhandledrejection
error
事件的使用。注意,对于节点,它是
unhandledrejection
而不是
unhandledrejection
@Freewind很抱歉,您发现了这一困惑-我们一直使用dom事件命名和节点事件命名(uncaughtException和onerror)。