1

我在蓝鸟承诺中抛出错误时遇到问题。采取以下代码:

var Promise = require('bluebird');
var domain = require('domain');

var problem = function() {
    return new Promise(function(resolve, reject){
        reject(new Error('Oops!'));
    });
};

domain.create()
    .on('error', function(e){
        console.log("Caught Error " + e.message)
        process.exit(1);
    })
    .run(function() {
        problem().done();
    });

我希望Caught Error Oops!在控制台中看到。但是,似乎该错误未在域内捕获,并且我在控制台中看到了致命错误和堆栈跟踪。

有谁知道为什么?

4

1 回答 1

1

该异常实际上是由 Bluebird 处理的。承诺拒绝与未处理的异常不同。相反,如果您在 a 中创建一个真正的未处理异常setTimeout,因此 Bluebird 不会处理它,因为它会在不同的堆栈上,您的域将按预期工作。

var Promise = require('bluebird');
var domain = require('domain');

var problem = function() {
    return new Promise(function(resolve, reject){
        setTimeout(function() {
            throw new Error('boom!');
        }, 1)

    });
};

domain.create()
    .on('error', function(e){
        console.log("Caught Error " + e.message)
        process.exit(1);
    })
    .run(function() {
        problem().done();
    });
于 2016-04-07T01:44:57.880 回答