Javascript Q:then回调中的静默异常?

Javascript Q:then回调中的静默异常?,javascript,promise,q,Javascript,Promise,Q,我在Q.promise的'then'回调中调用null变量函数时遇到一些问题 第一个调用(不使用Q)将显示错误,但第二个调用(使用wuth Q)不会显示错误 小例子: var Q = require('q'); var nul = null; var exp; (function (exp) { var A = (function () { function A() { }; A.prototype.foo = function () {

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

第一个调用(不使用Q)将显示错误,但第二个调用(使用wuth 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);
    }
});
process.on('uncaughtException', function (e) {
  console.log('Error: ' + e);
});
旧答案 以下是捕获JS/node.JS中错误的几个选项:

试块/抓块 这些方法的工作原理与Java/C类似,使用
try
块包装每个调用,并捕获错误,在
catch
块中处理

try {
    exp.a.bar(0);
} catch(e) {
    console.log(e);
}
您还可以添加finally块、检查异常/错误的类型等等,您可以在

Node.js uncaughtException处理程序 在节点中,通过将回调绑定到
uncaughtException
事件,您可以捕获所有未捕获的错误,这些错误将停止程序,如下所示:

this.foo().then(function () {
    try {
        console.log(nul);
        nul.qqq();
        console.log('ok');
    } catch (e) {
        console.log(e);
    }
});
process.on('uncaughtException', function (e) {
  console.log('Error: ' + e);
});
在程序中,这并不总是最好的做法,但如果您真的不想停止执行,这是一个选项


最后,我建议大家看看这篇文章,了解一下处理node.js中错误的最佳实践?console.log(nul)记录的内容您试图调用
nul
上的函数,该函数实际上为空,无法工作。通过调用
nul.qqq()
,您想做什么?您没有看到第二个错误,因为执行在第一个错误时停止。这就是JavaScript的工作原理。@ArunPJohny
nul
是空变量(我需要抛出异常TypeError)@Sosdoc您可以分别运行
bar(0)
bar(1)
,您将理解我的意思meaned@indapublic然后
process.on(“unhandledRejection”
就是方法。请只运行
exp.a.bar(0)
然后才是
exp.a.bar(0);
。您应该看到不同之处您的答案与问题I无关mean@indapublic你是对的,很抱歉,我看到了你遇到的问题,我更新了我的答案,这应该可以让你捕获
then()中的任何错误/异常
Callback噢!Q捕获所有错误,我不考虑:(谢谢,我稍后会检查一些。再次感谢