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

时间:2015-11-24 13:34:47

标签: javascript node.js stack stack-trace

当我运行此代码时:

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处理程序时,是否可以获取文件名/行?

由于

2 个答案:

答案 0 :(得分:3)

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

  

C:\ Users \ xxx \ Desktop> node test.js

     

C:\ Users \ xxx \ Desktop \ test.js:1(function(exports,require,   module,__ filename,__ dirname){throw'test';                                                                 ^测试

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

  

C:\ Users \ xxx \ Desktop> node test2.js

     

C:\ Users \ xxx \ Desktop \ test2.js:1(功能(出口,要求,   module,__ filename,__ dirname){throw new Error(                                          ^错误:测试       在对象。 (C:\用户\ XXX \桌面\ test2.js:1:69)       在Module._compile(module.js:456:26)       at 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非错误的事情,   但这应该避免。结果不包括潜力   用于获取调用堆栈,也不是用于编程的“名称”属性   检查,也没有描述出错的有用属性。

来自Error Handling in Node.js

答案 1 :(得分:0)

您无法从投掷的string获取堆栈跟踪。实际上,它是构建堆栈的Error对象。

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

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