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

时间:2017-01-10 12:54:08

标签: javascript node.js promise ecmascript-6 es6-promise

我不想为我使用的每个承诺键入.catch。如果没有这样做,承诺造成的错误是非常无益的。

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

2 个答案:

答案 0 :(得分:5)

对于开发期间的错误跟踪,默认情况下,V8(最近的Node.js和Chrome版本)已经有unhandledRejection(Node.js)和unhandledrejection(Chrome)事件侦听器,这导致{ Node.js中的{1}}警告和Chrome中的UnhandledPromiseRejectionWarning错误。

节点7中的弃用警告声明将在以后的Node.js版本中更改:

  

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

promises中的错误处理不是可选的,应该与Uncaught (in promise)相同。每一个有机会被拒绝的承诺都应该与try...catch链接。在catchasync...await的情况下,co.catch相同。

如果错误应该被忽略,则必须明确捕获它。如果错误处理需要在整个应用程序中保持一致并符合日志级别,则可以通过设计提供。例如。使用传统的try...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); 也可以扩展为使用第三方日志服务。

答案 1 :(得分:1)

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

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