我正在使用requestify发出一些 HTTP 请求。该模块内部使用了其他模块,例如 HTTP、socket 等。它还使用了 Q Promise。
requestify使用的模块可以异步抛出异常(例如socket模块可以抛出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;
}
关于javascript - node.js Q Promise 不会通过拒绝处理程序传播异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33408575/