【问题标题】:Missing stack trace on node.js uncaughtException generated by throw()throw() 生成的 node.js uncaughtException 上缺少堆栈跟踪
【发布时间】:2013-05-23 16:17:09
【问题描述】:

我正在尝试捕获 node.js uncaughtException 的堆栈跟踪,它适用于不同的错误,但不适用于 throw() 语句:

关于异常处理的正确堆栈跟踪:

$ cat errorFunc.js 
process.on('uncaughtException', function(exception) {
    console.log('uncaughtException occurred: ' + exception.stack);
});
MyError();

$ node errorFunc.js 
    uncaughtException occurred: ReferenceError: MyError is not defined
    at Object.<anonymous> (/home/jolcese/code/WebEnclaves/Server/errorFunc.js:5:1)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)
    at startup (node.js:119:16)
    at node.js:901:3
$

throw() 导致的异常丢失堆栈跟踪:

$ cat errorThrow.js 
process.on('uncaughtException', function(exception) {
    console.log('uncaughtException occurred: ' + exception.stack);
});
throw('my error');

$ node errorThrow.js 
uncaughtException occurred: undefined
$

知道为什么吗?

谢谢 何塞

免责声明:我知道使用 process.on('uncaughtException') 是一件非常非常糟糕的事情,我会受到惩罚,但在这段代码中使用域不是一个选项。

【问题讨论】:

    标签: javascript node.js


    【解决方案1】:

    JavaScript 让你可以抛出任何东西。

    如果你想在 JavaScript 中抛出堆栈跟踪错误,你需要抛出 Error 对象。 (specification )

    另外,throw 是一个操作符,而不是一个函数。

    试试

    throw new Error('my error');
    

    有关更多信息,请参阅 Mozilla 开发者网络上的 the manual

    【讨论】:

    • 如果您希望我详细说明在虚拟机级别(在 v8 中)如何以及为什么这样做,请告诉我。我认为这与解决您的问题无关。
    • 感谢本杰明的回答!你知道为什么 Web Worker 内部的行为不同吗?投掷; Web Worker 调用中的语句(如果已注册) onerror 回调,提供描述、lineno、colno 等。
    • @JoseOlcese 是的,最简单的答案是因为它们就是这样设计的。 WebWorkers 是 web 标准节点不遵守的一部分。只是 WebWorkers 有用。一般来说,当你关心调试时,你应该总是抛出 Error 对象而不是其他东西(应该总是有错误)
    猜你喜欢
    • 2013-03-02
    • 2023-03-05
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多