gpt4 book ai didi

node.js - 使用域来测试在 node.js 调用堆栈中抛出的错误。

转载 作者:搜寻专家 更新时间:2023-11-01 00:43:21 24 4
gpt4 key购买 nike

我正在尝试编写一些测试来捕获可能深入回调嵌套的错误,因此我决定尝试为此使用域。我已设法简化为以下测试用例:

"use strict";
var assert = require("assert");
var domain = require("domain");

function wrapInDomain(throwsAnError, callback) {
var thisDomain = domain.create();

thisDomain.on("error", function(error) {
console.log("calling callback");
//thisDomain.destory(); // I'm not sure if I should do this
callback(error);
});

thisDomain.run(function() {
process.nextTick(function(){
throwsAnError();
});
});
}

function throwsAnError() {
process.nextTick(function(){
throw new Error("I sensed a great disturbance in the force, as if millions of voices cried out in terror and were suddenly silenced. I fear something terrible has happened.");
});
}

describe("describe something that throws an error", function(){

it("it clause", function(done) {
wrapInDomain(throwsAnError, function(theError) {
console.log("got an error " + theError);
assert(false); //Assert something
done();
});
});


});

如果断言通过,mocha 会给出漂亮的彩色摘要,说明有多少测试通过或失败。但是如果一个assert失败了,node好像直接crash掉了。列出的错误是原始错误,而不是失败的断言。

我在这里做错了什么吗?或者这是某种需要报告的错误?

calling callback
got an error Error: I sensed a great disturbance in the force, as if millions of voices cried out in terror and were suddenly silenced. I fear something terrible has happened.

/home/gareth2/cloud/apifacade/src/test/resources/testCase.js:23
throw new Error("I sensed a great disturbance in the force, as if mill
^
Error: I sensed a great disturbance in the force, as if millions of voices cried out in terror and were suddenly silenced. I fear something terrible has happened.
at /home/gareth2/cloud/apifacade/src/test/resources/testCase.js:23:15
at process._tickDomainCallback (node.js:463:13)

*node crashes*

我正在使用以下版本的 Node 。

$ node --version
v0.10.33

最佳答案

问题是您需要在 Mocha 捕获失败的异常之前退出域,因为绑定(bind)到域的事件处理程序在域中执行。如果您将错误处理程序更改为此,它将起作用:

thisDomain.on("error", function(error) {
thisDomain.exit();
process.nextTick(function () {
callback(error);
console.log("calling callback");
});
});

您需要在上面的代码中调用process.nextTick(或setImmediatesetTimeout(..., 0))以便语句 callback(error)thisDomain.exit() 运行后生效的域中执行。 Node 的工作方式是,当您创建一个新的回调来处理事件或使用 process.nextTick(或等效函数)运行时,回调作为一个整体被关联具有特定域。假设如下回调

myDomain.on("error", function () {
A;
myDomain.exit();
B;
});

任何由 A 引起的错误都会在 myDomain 中处理,但 B 也是如此,因为 B 属于与 A 相同的回调。

通过使用 process.nextTick,我们创建了一个与新域关联的新回调,该回调在 thisDomain.exit() 执行后生效。修改上面的例子,它将是:

myDomain.on("error", function () {
A;
myDomain.exit();
process.nextTick(function () {
B;
});
});

现在 B 属于与 A 不同的回调,并且此回调是在 我们退出 myDomain 之后创建的,所以它在创建 myDomain 之前有效的域中执行。

关于node.js - 使用域来测试在 node.js 调用堆栈中抛出的错误。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27192917/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com