【问题标题】:node.js Q promises does not propagate exception through rejection handlernode.js Q Promise 不会通过拒绝处理程序传播异常
【发布时间】:2015-10-29 16:07:30
【问题描述】:

我正在使用requestify 发出一些 HTTP 请求。该模块在内部使用了其他模块,例如 HTTP、socket 等。它还使用了 Q Promise。

requestify 使用的模块可以异步抛出异常(例如 ECONNREFUSED 可以被 socket 模块抛出)。每当抛出异常时,控制流都会中断到我的进程的通用未捕获异常处理程序,并且不会传播到承诺的错误/拒绝处理程序。

下面的代码是一个示例代码,代表问题。

问题 - 我是否可以通过 Q 承诺的拒绝处理程序来处理此类异常?

// sample code
var _inspect = require('util').inspect;
var _q = require('q');

function handle_uncaught_exception(ex) {
  console.log(" Uncaught Exception: " + _inspect(ex));
  process.exit(2);
}
process.on('uncaughtException', handle_uncaught_exception);

function foo_3rd_party_code() {
  var d = _q.defer();
  setTimeout(
    function () {
      throw new Error("TEST_EXCEPTION");
    },
    1000
  );
  return d.promise;
}

foo_3rd_party_code()
  .then(
    function (val) {
      console.log("Promise Fullfilled: " + _inspect(val));
      process.exit(0);
    },
    function (err) {
      // it would be nice to see the TEST_EXCEPTION here.
      console.log("Promise Rejected: " + _inspect(err));
      process.exit(1);
    }
  );

【问题讨论】:

  • 如果你有多个 Promise 同时运行怎么办?您的未捕获异常处理程序如何知道哪些将被拒绝?
  • 更合理的方法是修复(或修复)第三方代码(通过适当的流程),这样它就不会出现throw 异常但会报告错误。
  • 谢谢。已要求模块所有者查看捕获异常并通过拒绝()进行转换的可能性。

标签: javascript node.js promise q


【解决方案1】:

foo_3rd_party_code 无法捕获或处理异常,因为它看不到它。为此,您必须使用 promise 的 reject 方法。

function foo_3rd_party_code() {
  var d = _q.defer();
  setTimeout(
    function () {
      d.reject(new Error("TEST_EXCEPTION"));
    },
    1000
  );
  return d.promise;
}

【讨论】:

  • 这不是我的代码。异常被深埋在第 3 方代码中。我已向模块所有者发送请求以查看可能的增强功能。
猜你喜欢
  • 2015-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-30
  • 1970-01-01
  • 2023-03-10
  • 2015-04-26
相关资源
最近更新 更多