JavaScript 例外:这是怎么回事?



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

在重新引发异常时,如何"转发"此信息?

Object.keys尊重不可计数的属性,使用

var keys = Object.getOwnPropertyNames(exc);

在这种情况下,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}获取此堆栈跟踪?

最新更新