防止吞咽错误的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...await
或co
的情况下.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 ) } )