How to specify a “caused by” in a JavaScript Error?

最后都变了- 提交于 2019-12-05 10:54:45

问题


In my NodeJS program, I parse some user JSON file.

So I use :

this.config = JSON.parse(fs.readFileSync(path));

The problem is that if the json file is not correctly formated, the error thrown is like:

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)
...

As it is not really user friendly I would like to throw an Error specifying some user friendly message (like "your config file is not well formated") but I want to keep the stacktrace in order to point to the problematic line.

In the Java world I used throw new Exception("My user friendly message", catchedException) in order to have the original exception which caused that one.

How is it possible in the JS world?


回答1:


What I finally did is:

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;
}



回答2:


Joyent released a Node.js package that can be used exactly for that. It is called VError. I paste an example of how you would use the pacakge:

var fs = require('fs');
var filename = '/nonexistent';
fs.stat(filename, function (err1) {
    var err2 = new VError(err1, 'stat "%s"', filename);
    console.error(err2.message);
});

would print the following:

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



回答3:


Use a try / catch block:

try {
    this.config = JSON.parse("}}junkJSON}");
    //...etc
}
catch (e) {
    //console.log(e.message);//the original error message 
    e.message = "Your config file is not well formatted.";//replace with new custom message
    console.error(e);//raise the exception in the console
    //or re-throw it without catching
    throw e;
}

http://jsfiddle.net/0ogf1jxs/5/

UPDATE: If you really feel the need for a custom error you can define your own:

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!");
}

http://jsfiddle.net/kL394boo/

Lots of useful info at https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error



来源:https://stackoverflow.com/questions/25763837/how-to-specify-a-caused-by-in-a-javascript-error

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!