扩展错误会产生错误的堆栈跟踪信息

时间:2016-08-27 16:48:13

标签: javascript node.js runtime-error stack-trace

此问题与处理es6扩展的Extended Errors do not have message or stack trace不同,但我使用的是es5。

这是我的代码

test.js

function FooError(message) {
    this.stack = (new Error(message)).stack;
    console.log('this.stack', this.stack);
    console.log('new_error_stack', (new Error(message)).stack);
    console.log('after');
}
FooError.prototype = new Error;

throw new FooError("foo");

这给出了以下输出:节点版本6.4(node test.js

this.stack Error
    at Object.<anonymous> (/tmp/test.js:7:22)
    at Module._compile (module.js:556:32)
    at Object.Module._extensions..js (module.js:565:10)
    at Module.load (module.js:473:32)
    at tryModuleLoad (module.js:432:12)
    at Function.Module._load (module.js:424:3)
    at Module.runMain (module.js:590:10)
    at run (bootstrap_node.js:394:7)
    at startup (bootstrap_node.js:149:9)
    at bootstrap_node.js:509:3
new_error_stack Error: foo
    at Error.FooError (/tmp/test.js:4:33)
    at Object.<anonymous> (/tmp/test.js:9:7)
    at Module._compile (module.js:556:32)
    at Object.Module._extensions..js (module.js:565:10)
    at Module.load (module.js:473:32)
    at tryModuleLoad (module.js:432:12)
    at Function.Module._load (module.js:424:3)
    at Module.runMain (module.js:590:10)
    at run (bootstrap_node.js:394:7)
    at startup (bootstrap_node.js:149:9)
after

/tmp/test.js:9
throw new FooError("foo");
^
Error
    at Object.<anonymous> (/tmp/test.js:7:22)
    at Module._compile (module.js:556:32)
    at Object.Module._extensions..js (module.js:565:10)
    at Module.load (module.js:473:32)
    at tryModuleLoad (module.js:432:12)
    at Function.Module._load (module.js:424:3)
    at Module.runMain (module.js:590:10)
    at run (bootstrap_node.js:394:7)
    at startup (bootstrap_node.js:149:9)
    at bootstrap_node.js:509:3

正如您所看到的,&#39; this.stack&#39;并没有显示与“#new_error_stack”相同的东西,例如,this.stack显示堆栈,好像在调用require时抛出了错误。此外,抛出的堆栈也是&#34;不正确的&#34;。

我从https://stackoverflow.com/a/5251506/1993501获取了代码,因为我想使用instanceof FooError,所以我使用了行FooError.prototype = new Error

正如您所看到的,&#39; new_error_stack&#39;给出预期的输出,但我希望两个值都相等。

这会导致错误对我的图书馆用户不是很有用,请参阅相应的问题:https://github.com/open-xml-templating/docxtemplater/issues/245

究竟发生了什么,如何防止它并保留正确的错误类型(例如能够使用instanceof)?

1 个答案:

答案 0 :(得分:1)

我找到了解决问题的可能方案,但我并不完全确定它可以解决您的所有问题。我使用的是Error.prototype而不是new Error(这就是你所拥有的)。我从这个问题的第一个答案中找到了这个解决方案:How do I create a custom Error in JavaScript?

我还更改了console.log行以连接两个字符串,因为我使用alert()来显示输出以进行测试。

Kevin Hakanson回答了为什么你可能会或可能不想在他的回答中使用这个解决方案。以下是回答您问题的代码:

function FooError(message) {
    this.stack = (new Error(message)).stack;
    console.log('this.stack ' + this.stack);
    console.log('new_error_stack ' + (new Error(message)).stack);
    console.log('after');
}

FooError.prototype = Error.prototype;

throw new FooError("foo");

您可能希望在最后一行使用try / catch块。