javascript - 防止 ES6 promise 吞下错误(不使用 .catch)

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

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

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

最佳答案

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

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

Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

promise 中的错误处理不是可选的,应该与 try...catch 同等对待。每个有可能被拒绝的 promise 都应该与 catch 链接起来。在 async...awaitco 的情况下,.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);

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

关于javascript - 防止 ES6 promise 吞下错误(不使用 .catch),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41569327/

相关文章:

javascript - RethinkDB - 将导入的 MySQL 时间戳字符串转换为时间对象

javascript - React 缺少 onClick?

node.js - 选择多个复选框在 Puppeteer headless 浏览器中不起作用

node.js - Mongoose 查询返回空

javascript - Node.js 捕获生成后引发的 ENOMEM 错误

javascript - 如何避免延迟反模式

javascript - Backbone动态保存属性

javascript - 在express js上找不到post请求的静态信息

javascript - 如何返回真正有效的 thenable 对象

javascript - 无法获取 Promise/ajax 数据以返回父函数