Q中的静默异常:然后回调

Silent exceptions in Q:then callback?

本文关键字:然后 回调 异常 静默      更新时间:2023-09-26

我在Q.promise的'then'回调中调用null变量函数时遇到了一些问题。

第一次调用(不使用Q)将显示错误,而第二次调用(使用Q)则不会显示错误。

小例子:

var Q = require('q');
var nul = null;
var exp;
(function (exp) {
    var A = (function () {
        function A() {
        };
        A.prototype.foo = function () {
            var d = Q.defer();
            d.resolve('Hello, world');
            return d.promise;
        };
        A.prototype.bar = function (i) {
            switch (i) {
                case 0:
                    /**
                     * That's all ok, "TypeError: Cannot read property 'qqq' of null"
                     */
                    console.log(nul);
                    nul.qqq();
                    console.log('ok');
                    break;
                case 1:
                    /**
                     * it's not ok, I see only result of "console.log(nul)", line 29
                     */
                    this.foo().then(function () {
                        console.log(nul);
                        nul.qqq();
                        console.log('ok');
                    });
                    break;
            };
        };
        return A;
    })();
    exp.A = A;
}) (exp || (exp = {}));
exp.a = new exp.A();
// You should run functions SEPARATELY!!!
exp.a.bar(0);   //  in that case: that's all ok, "TypeError: Cannot read property 'qqq' of null"
exp.a.bar(1);   //  int that case: it's not ok, I see only result of "console.log(nul)", line 29

我不知道怎么解决这个问题

在控制台上看不到第二个错误的原因是Q捕获所有错误并让您单独处理它们。

您可以通过链接catch()函数来处理then()中的错误,在您的示例中,可以这样做:

this.foo().then(function () {
    console.log(nul);
    nul.qqq();
    console.log('ok');
}).catch(function(error) {
    // do something with error
    console.log(error);
});

你也可以通过在then()中使用try/catch块来获得这种行为,像这样:

this.foo().then(function () {
    try {
        console.log(nul);
        nul.qqq();
        console.log('ok');
    } catch (e) {
        console.log(e);
    }
});
<标题>老回答

下面是一些在JS/node.js中捕捉错误的选项:

Try/Catch块

这些工作就像在他们的Java/c#等效,包装你用try块和捕获错误的每个调用,在catch块处理它

try {
    exp.a.bar(0);
} catch(e) {
    console.log(e);
}

您还可以添加finally块,检查异常/错误的类型等等,您可以在MDN页面上阅读更多信息

Node.js uncaughtException handler

在node中,您可以通过将回调绑定到uncaughtException事件来捕获所有未捕获的错误,这些错误将停止您的程序:

process.on('uncaughtException', function (e) {
  console.log('Error: ' + e);
});

这在程序中并不总是最好的,但是如果你真的不想停止执行,这是一个选项。

最后,我建议大家看看这篇官方文章,了解如何处理node.js中的错误