如何指定";由「;在JavaScript错误中?

如何指定";由「;在JavaScript错误中?,javascript,node.js,stack-trace,Javascript,Node.js,Stack Trace,在我的NodeJS程序中,我解析一些用户JSON文件 因此,我使用: this.config = JSON.parse(fs.readFileSync(path)); 问题在于,如果json文件格式不正确,抛出的错误如下: undefined:55 }, ^ SyntaxError: Unexpected token } at Object.parse (native) at new MyApp (/path/to/docker/

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

因此,我使用:

this.config = JSON.parse(fs.readFileSync(path));
问题在于,如果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)
...
由于它不是真正的用户友好型,我想抛出一个
错误
指定一些用户友好的消息(比如“您的配置文件格式不好”),但我想保留stacktrace以指向有问题的行

在Java世界中,我使用了
抛出新异常(“我的用户友好消息”,catchedeException)
,以获得导致该异常的原始异常

在JS世界中如何实现这一点?

使用块:

更新:如果确实需要自定义错误,可以定义自己的错误:

function BadConfig(message) {
   this.message = message;
   this.name = "BadConfig";
}
BadConfig.prototype = new Error();
BadConfig.prototype.constructor = BadConfig;

try {
    this.config = JSON.parse("}}badJson}");
} catch(e) {
    throw new BadConfig("Your JSON is wack!");
}

许多有用的信息在

我最后做的是:

试试看{
this.config=JSON.parse(fs.readFileSync(path));
}捕捉(错误){
var newErr=newerror(“读取JSON文件时出现问题”);
newErr.stack+='\n使用者:'+err.stack;
扔掉纽尔;
}

Joyent发布了一个Node.js包,可以完全用于此目的。它被称为。我粘贴了一个关于如何使用pacake的示例:

var fs = require('fs');
var filename = '/nonexistent';
fs.stat(filename, function (err1) {
    var err2 = new VError(err1, 'stat "%s"', filename);
    console.error(err2.message);
});
将打印以下内容:

stat "/nonexistent": ENOENT, stat '/nonexistent'

2021更新:在JS中链接异常:

class MyAppError extends Error {
    constructor(...params) {
        super(...params)
        if (Error.captureStackTrace) {
            // This is the key line!
            Error.captureStackTrace(this, this.constructor);
        }
        this.name = this.constructor.name
    }
}

请参阅

上的Mozilla文档,将其包装在
中,尝试{}catch(){}
并创建您自己的消息。是的,这是我最初想要做的。但我也希望保留原始堆栈,其中包含指向问题行的原始消息(在我的示例中)。。。我在网络上看到的JS错误处理中找不到一个“好”的方法来做到这一点…我实际上看到我的问题是重复的:我想“抛出”一些东西,因为我在库代码中,所以我希望使用它的开发人员能够捕获它,并以他想要的方式向用户显示它。。。实际上,我想做一些事情,比如在JavaSee中将根本原因传递给一个新的异常:只需编辑这个异常,并将e.message更改为用户友好的消息,然后抛出e@JonasLiljestrand-更新了相应的答案谢谢你的回答,但它仍然没有回答我的问题:如何在JS中链接异常,比如将原因添加到Java中的异常。您的
BadConfig
类不包含捕获的
e
,并且如果捕获
BadConfig
的人在
console.error
中输出它,则不能将其显示为错误日志中的原因。然而,有关的最佳实践提到根本不要接触“stack”属性。在java中有一个“原因”属性。nodejs的人希望设置吗?更好的答案应该是只在读取堆栈时计算堆栈。类似于Object.defineProperty(newErr,'stack',{get:function(){return???+'\n使用者:'+err.stack}})。但除此之外,这对我来说似乎很好。我想最后一行应该是:
throw newErr这是我一直在寻找的,谢谢。这是一个清晰的示例,说明了当您拥有自定义堆栈跟踪并且在受控情况下抛出错误时(即当库向您提供没有错误的stacktrace时)应该怎么做。请不要将相同的答案发布到。发布一个好的答案,然后投票/标记以重复结束其他问题。如果问题不是重复的,请根据问题定制您的答案。是verror的更现代的替代品,具有内置类型。这不是标准的,它是一个特定的V8功能。
class MyAppError extends Error {
    constructor(...params) {
        super(...params)
        if (Error.captureStackTrace) {
            // This is the key line!
            Error.captureStackTrace(this, this.constructor);
        }
        this.name = this.constructor.name
    }
}