从nodejs中抛出的字符串中获取堆栈跟踪

Get a stack trace from a throwed string in nodejs

本文关键字:获取 堆栈 字符串 跟踪 nodejs      更新时间:2023-09-26

当我运行此代码时:

throw 'a string';

我在我的终端上得到了这个堆叠竞赛:

$ node test.js
/home/user/test.js:2
throw 'a string';
^
a string

这是文件名和出现此异常的行。

我正在尝试构建一个异常日志机制,当我使用uncaughtException处理程序时,我无法获得文件名或行。

process.on('uncaughtException', function() {
  console.log(arguments);
});
throw 'a string';

当我运行这个代码时,我只得到:

$ node test2.js
{ '0': 'a string' }

当我使用uncaughtException处理程序时,是否可以获得filename/行?

感谢

使用throw new Error('my message');

C: ''Users''xxx''Desktop>节点测试.js

C: ''Users''xxx''Desktop''test.js:1(函数(exports,required,module,__filename,__dirname){throw'test';^测试

test.js的内容:throw 'test';

C: ''Users''xxx''Desktop>节点test2.js

C: ''Users''xxx''Desktop''test2.js:1(函数(exports,required,module,__filename,__dirname){抛出新错误(^错误:测试在对象处。(C:''Users''xxx''Desktop''test2.js:1:69)在模块中_compile(模块.js:456:26)位于Object.Module_extensions..js(Module.js:474:10)在Module.load(Module.js:356:32)位于Function.Module_load(Module.js:312:12)位于Function.Module.runMain(Module.js:497:10)启动时(node.js:119:16)在node.js:906:3

test2.js的内容:throw new Error('test');

还有:

在JavaScript中,你可以从技术上throw那些不是错误的东西,但这应该避免。结果不包括潜在用于获取调用堆栈,也不是用于编程的"name"属性检查,也没有任何有用的属性来描述出了什么问题。

来自Node.js 中的错误处理

您无法从抛出的string中获取堆栈跟踪。实际上是Error对象构建了堆栈。

您可能会想到一种变通方法,在捕获异常时构建new Error,但堆栈跟踪不会返回到抛出的字符串。

解决方案:永远不要抛出字符串,而是使用错误。