此问题与处理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)?
答案 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块。