如何在JavaScript错误中指定"由...引起"?

Ant*_* O. 17 javascript stack-trace node.js

在我的NodeJS程序中,我解析了一些用户JSON文件.

所以我使用:

this.config = JSON.parse(fs.readFileSync(path));
Run Code Online (Sandbox Code Playgroud)

问题是如果json文件没有正确格式化,抛出的错误就像:

undefined:55
            },
            ^
SyntaxError: Unexpected token }
    at Object.parse (native)
    at new MyApp (/path/to/docker/lib/node_modules/myApp/lib/my-app.js:30:28)
...
Run Code Online (Sandbox Code Playgroud)

由于它不是真正的用户友好,我想抛出一个Error指定一些用户友好的消息(如"你的配置文件没有很好的格式化"),但我想保持堆栈跟踪,以指向有问题的行.

在我使用的Java世界throw new Exception("My user friendly message", catchedException)中,为了得到导致那个的原始异常.

JS世界怎么可能?

Ant*_* O. 25

我最后做的是:

try {
    this.config = JSON.parse(fs.readFileSync(path));
} catch(err) {
    var newErr = new Error('Problem while reading the JSON file');
    newErr.stack += '\nCaused by: '+err.stack;
    throw newErr;
}
Run Code Online (Sandbox Code Playgroud)

  • 然而,关于最佳实践的 [“主要来源”](https://www.joyent.com/developers/node/design/errors) 提到根本不要触及“堆栈”属性。在java中有一个“原因”属性。nodejs 人是否希望设置它? (2认同)

Seb*_*ber 10

ECMAScript 有一个新的错误原因提案,并在 TC34 上达到了阶段 4!

这意味着它将出现在下一个 ECMAScript 版本中!

https://github.com/tc39/proposal-error-cause

您可以将原因作为错误选项提供:

throw new Error(`Couldn't parse file at path ${filePath}`, { cause: err });
Run Code Online (Sandbox Code Playgroud)

ES 提案仅在语言级别上将其形式化,但浏览器/NodeJS 通常应同意在实践中记录完整的因果链(请参阅https://github.com/nodejs/node/issues/38725


截至今天(2021 年底),Firefox Devtools 已经能够记录嵌套堆栈跟踪!

在此输入图像描述