Javascript Q:then回调中的静默异常?
我在Q.promise的'then'回调中调用null变量函数时遇到一些问题 第一个调用(不使用Q)将显示错误,但第二个调用(使用wuth Q)不会显示错误 小例子: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 () {
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的工作原理。@ArunPJohnynul
是空变量(我需要抛出异常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捕获所有错误,我不考虑:(谢谢,我稍后会检查一些。再次感谢