node.js Q promise不会通过拒绝处理程序传播异常

node.js Q promises does not propagate exception through rejection handler

本文关键字:处理 拒绝 程序 传播 异常 js promise node      更新时间:2023-09-26

我正在使用requestify进行一些HTTP请求。该模块内部使用其他模块,如HTTP、套接字等。它还使用Q promise。

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

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

问题-我有可能通过Q promise的拒绝处理程序来处理此类异常吗?

// 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);
    }
  );

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;
}