防止ES6承诺吞下错误(不使用.catch)



我不想为我使用的每个promise都键入.catch。如果不这样做,由承诺造成的错误将毫无帮助。

纯粹为了这个目的而使用像蓝鸟这样的整个图书馆让我感到不舒服。

对于开发过程中的错误跟踪,V8(最新的Node.js和Chrome版本)默认已经有了unhandledRejection(Node.js)和unhandledrejection(Chrome)事件侦听器,这导致Node.js中出现UnhandledPromiseRejectionWarning警告,Chrome中出现Uncaught (in promise)错误。

Node 7中的弃用警告表示,这将在未来的Node.js版本中更改:

不赞成使用未经处理的承诺拒绝。将来,未处理的promise拒绝将使用非零退出代码终止Node.js进程。

promise中的错误处理不是可选的,应该与try...catch一样对待。每一个有机会被拒绝的承诺都应该与catch联系在一起。在async...awaitco的情况下,.catchtry...catch相同。

如果错误应该被忽略,那么它必须被明确地捕获。如果错误处理需要在整个应用程序中保持一致并符合日志级别,则可以通过设计提供。例如,使用传统debug封装:

const debug = require('debug');
function catchFn(err, ns = 'myapp:caughtPromises') {
debug(ns)(err);
}
function catchPromise(promise, ns) {
promise.catch(err => catchFn(err, ns));
return promise;
}
...
try {
await promise;
} catch (err) {
catchFn(err);
}
// or
catchPromise(promise);
// or
promise.catch(catchFn);

catchFn还可以扩展为使用第三方日志服务。

为未处理的拒绝添加处理程序。你可以像那样处理它们一次,而不是一直复制粘贴.catch语句。

process.on( 'unhandledRejection', ( error, promise ) => {
console.log( 'UPR: ' + promise + ' with ' + error )
console.log( error.stack )
} )

最新更新