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

我不想为每个使用的承诺input.catch。 没有做这个承诺所造成的错误是极其无益的。

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

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

在节点7中的弃用警告声明这将在未来的Node.js版本中被更改:

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

承诺中的error handling不是可选的,应该像try...catch对待。 每一个有机会被拒绝的承诺都应该被束缚catch 。 而在async...awaitco的情况下.catch是相同的try...catch

如果错误应该被忽略,那么必须明确地被捕获。 如果error handling需要在应用程序中保持一致并符合日志级别,则可以通过devise来提供。 例如与传统的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也可以扩展为使用第三方日志logging服务。

添加一个处理程序到您的进程未处理的拒绝。 您可以像这样处理它们,而不是一直拷贝粘贴.catch语句。

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