捕获所有未处理的 javascript 承诺拒绝
Catch all unhandled javascript promise rejections
我想捕获在 javascript Promise 中发生的所有未处理的 exceptions/rejections。有没有一种很好的方法可以在不在 Promise 链的每一端添加 .catch(..)
的情况下捕获它们? (如果忘记添加,错误会自动消失)。
GoogleChrome中的开发者控制台可以记录它们,我也喜欢在生产环境中记录它们。
对于正常的 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 没有。
有些图书馆有自己的 API 来执行此操作。一些浏览器会报告未处理的拒绝(迟早)。
实际上,done
可能不会做你想做的事。这就是为什么它不是规范的一部分。不管怎样,你还是要记得调用它。
没有可靠的、跨平台的、跨库的方法来做到这一点。
整个世界都在等待 unhandledrejection
和 rejectionhandled
事件。截至 2016 年 3 月,Chrome 现在是第一个支持它的人。
示例:
window.addEventListener('unhandledrejection', function(event) {
console.error('Unhandled rejection (promise: ', event.promise, ', reason: ', event.reason, ').');
});
Mozilla 开发人员:
onrejectionhandled, onunhandledrejection
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>
这种方法的好处是只有一个接口,它允许您处理未捕获的错误和未处理的承诺拒绝。
请注意,在 Node 中,事件称为 unhandledRejection
:
process.on('unhandledRejection', function(err, promise) {
console.error('Unhandled rejection (promise: ', promise, ', reason: ', err, ').');
});
在版本 12+ 上,节点将终止这些拒绝。
我想捕获在 javascript Promise 中发生的所有未处理的 exceptions/rejections。有没有一种很好的方法可以在不在 Promise 链的每一端添加 .catch(..)
的情况下捕获它们? (如果忘记添加,错误会自动消失)。
GoogleChrome中的开发者控制台可以记录它们,我也喜欢在生产环境中记录它们。
对于正常的 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 没有。
有些图书馆有自己的 API 来执行此操作。一些浏览器会报告未处理的拒绝(迟早)。
实际上,done
可能不会做你想做的事。这就是为什么它不是规范的一部分。不管怎样,你还是要记得调用它。
没有可靠的、跨平台的、跨库的方法来做到这一点。
整个世界都在等待 unhandledrejection
和 rejectionhandled
事件。截至 2016 年 3 月,Chrome 现在是第一个支持它的人。
示例:
window.addEventListener('unhandledrejection', function(event) {
console.error('Unhandled rejection (promise: ', event.promise, ', reason: ', event.reason, ').');
});
Mozilla 开发人员: onrejectionhandled, onunhandledrejection
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>
这种方法的好处是只有一个接口,它允许您处理未捕获的错误和未处理的承诺拒绝。
请注意,在 Node 中,事件称为 unhandledRejection
:
process.on('unhandledRejection', function(err, promise) {
console.error('Unhandled rejection (promise: ', promise, ', reason: ', err, ').');
});
在版本 12+ 上,节点将终止这些拒绝。