Nuc*_*eon 4 mocha.js node.js node.js-domains
当运行利用域进行错误处理的测试时,即使库中的域处理程序应该捕获错误,Mocha仍然会抛出错误.如果我在Mocha之外执行代码,它的功能正确,让我相信问题是Mocha.
例:
foo.js
module.exports = function(done) {
var domain = require("domain");
var d = domain.create();
d.on("error", function() {
done();
});
d.run(function() {
throw new Error("foo");
});
}
Run Code Online (Sandbox Code Playgroud)
test.js - foo.js域内没有捕获到内部错误.
describe("test", function() {
it("should succeed", function(done) {
var foo = require("./foo.js");
foo(function() {
console.log("done");
done();
});
});
});
result : error thrown
Run Code Online (Sandbox Code Playgroud)
script.js - 域正确捕获错误并冒泡.
var foo = require("./foo.js");
foo(function() {
console.log("done");
});
result : done
Run Code Online (Sandbox Code Playgroud)
正如您在上面所看到的,如果我直接将节点定向到script.js其功能,则域处理程序将捕获错误并继续执行代码.如果我在Mocha测试中运行相同的代码块,则错误将暂停测试并给出失败.我相信这是因为错误是在uncaughtException处理程序或类似的东西上发送的.另一个复杂的问题是它在Mocha中正常工作,如果我在函数调用周围有一个process.nextTick(),让我相信Mocha只能处理同步错误,但是对于异步错误可以正常工作.
这里有一些关于这个问题的讨论:https://groups.google.com/forum/#! msg/nodejs /n- W9BSfxCjI/SElI1DJ_6u0J和https://github.com/joyent/node/issues/4375.
我的困惑是,所有这些讨论似乎都表明问题已在几个月前得到解决.任何人都知道这个问题的简单解决方法,或者为什么我没有看到其他人似乎相信的错误已修复此时此问题.
我在Windows 7上的CentOS 6.3 Vagrant VirtualBox上运行节点v0.10.18和Mocha 1.13.0.
Nuc*_*eon 12
发现了问题.NodeJS域捕获同步错误,但事件继续冒泡到try/catch.如果你domain.run()在一个try/catch域中包装一个域错误处理程序,那么catch将被执行.
因此,似乎最好的做法是在所有内部使用process.nextTick domain.run().这在文档示例中显示,但未按我的意愿明确表达.
例:
d.run(function() {
process.nextTick(function() {
// do stuff
});
});
Run Code Online (Sandbox Code Playgroud)
在这种情况下,缺陷不在摩卡.
在try/catch中没有捕获同步错误的NodeJS域的证明:https://gist.github.com/owenallenaz/7141699
| 归档时间: |
|
| 查看次数: |
2634 次 |
| 最近记录: |