JavaScript异常:这是什么交易?

时间:2013-08-02 12:10:34

标签: javascript json node.js exception try-catch

我在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

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

2 个答案:

答案 0 :(得分:0)

Object.keys尊重无法使用的属性,请使用

var keys = Object.getOwnPropertyNames(exc);

答案 1 :(得分:0)

在这种情况下,Exception的属性是['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 {}获取此堆栈跟踪?