0

我在使用 Node.js v.0.10.12 中的异常对象时遇到问题。

代码:(test.js)

var _ = require('underscore');

var invalidJson = '{ this is bad }';

try {
    JSON.parse( invalidJson );
}

catch (exc) {
    var keys = Object.keys(exc);
    console.log('Exception keys (' + keys.length + '): ', keys);

    _.each(exc, function (value, key) {
        console.log('exc[' + key + '] = ' + value);
    });

    throw exc;
}

输出:

Exception keys (0):  []

test.js:21
    throw exc;
          ^
SyntaxError: Unexpected token t
    at Object.parse (native)
    at Object.<anonymous> (test.js:10:7)
    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

为什么异常是空对象?

此外,报告错误来自 test.js:21,但实际上在 'invalidJson':1 中。一开始没有捕获异常会得到以下错误消息:

undefined:1
{ this is bad }
  ^
SyntaxError: Unexpected token t

重新抛出异常时如何“转发”此信息?

4

2 回答 2

0

Object.keys尊重不可枚举的属性,使用

var keys = Object.getOwnPropertyNames(exc);
于 2013-08-02T12:58:48.580 回答
0

在这种情况下,异常的属性是 ['stack', 'arguments', 'type', 'message']。

剩下的是堆栈跟踪。'stack' 是一个字符串:

SyntaxError: Unexpected token t
    at Object.parse (native)
    at Object.<anonymous> (test.js:10:7)

......

这是使用 try {} catch {} 捕获异常时,

然而,如果这个 try/catch 被删除,并留给系统处理,它会输出一个更有帮助的堆栈跟踪:

undefined:1
{ this is bad }

如何使用 try {} catch {} 获取此堆栈跟踪?

于 2013-08-02T20:43:57.510 回答