javascript - Promise.catch 正在吞噬错误

标签 javascript node.js error-handling callback promise

我在 Node.js 中使用回调和出色的异步库完成了大量异步编码,效果很好。我正在尝试使用一个使用 promises 的模块,但我遇到了一个问题,即在 promise 之后抛出的任何错误仍然冒出并被 promise 错误处理程序捕获。

这使得调试错误变得非常困难,因为我不知道它们会在哪里弹出,它们不会被抛出也不会导致应用程序崩溃。

下面的示例代码;我想要做的就是退出 promise 链并在它被解决后将其留在后面,而不是捕获所有与它无关的后续错误。

function one (input, callback) {

  doSomeAsyncWork(input)
  .then(function (result) {
    return callback(null, result);
  })
  .catch(function (err) {
    logError(err);
    return callback(err);
  });

}

function two (err, result) {

  if (err) { ... }

  var x = callAMethodThatThrows();
  ...

}

one('abc', two);

在此示例中,方法 callAMethodThatThrows() 抛出一个错误,该错误被冒泡到 promise catch() block 。这可以防止应用程序崩溃并使其处于未知状态。

非常感谢任何建议,谢谢。

最佳答案

是的,很抱歉 - 我们正在修复 (1) Node.js 中的默认行为。与此同时,我指定并Petka添加(在其他人的支持下)用于查找这些错误的钩子(Hook):

process.on("unhandledRejection", (err, p) => {
    console.error(err); // print the error
});

请注意,如果您自己异步执行 .catch,这可能会捕获一些漏报 - 根据我的经验,这种情况非常罕见。

另请注意,使用 promises,您的服务器通常不会处于未知状态,您可以并且应该在合理的情况下尝试从错误中恢复。由于 promises 始终意味着抛出安全代码,因此您可以进行细粒度的错误处理。

请注意,promises 使得异步库在很大程度上变得不需要了。如果您仍然希望使用回调并且只是希望“那些讨厌的 promises”会让您一个人呆着并让您继续编写回调,那很好 - promises 是安全的,但您可以通过执行 off 的事情来避免这种情况 promise 代码:

myPromiseFn().then(v => {
    process.nextTick(() => cb(null, v)); // next tick, to escape the chain
}, e => process.nextTick(() => cb(e));

请注意,公平 promise 库还带有一个 asCallback 回调,用于将 promise 代码转换为 Node 错误返回回调。

(1)有人说没问题,看图

关于javascript - Promise.catch 正在吞噬错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35995867/

相关文章:

javascript - jQuery 将对象解析为辅助函数

node.js - mocha.opts 可以添加评论吗?

php - 上传图片文件名不能为空错误

c# - 来自 WPF 应用程序的异常报告

javascript - 无效管道参数 : '[object Object]' for pipe 'AsyncPipe' but console gives Observable?

javascript - 如何使用 javaScript 中的 DOM 自动递增编号结果?

javascript - 在 d3.js 中的范围的平均值(或中值)处绘制网格线

regex - 有什么方法可以从 npm search 中搜索包名称吗?

javascript - 'forever' 日志文件是否同时包含 STDOUT 和 STDERR 内容?

asp.net - 如何在 asp.net 中优雅地处理这个错误?