在JavaScript中定义自定义错误的正确方法是什么?
通过SO搜索我发现了大约6种不同的方法来定义自定义错误,但我不确定每种方法的优势(dis)。
从我对JavaScript中原型继承的理解(有限),这段代码应该足够了:
function CustomError(message) {
this.name = "CustomError";
this.message = message;
}
CustomError.prototype = Object.create(Error.prototype);
答案 0 :(得分:3)
最简单的当然,在我看来,除非您需要更复杂的错误报告/处理,否则最好使用:
throw Error("ERROR: This is an error, do not be alarmed.")
答案 1 :(得分:1)
通常我只使用throw new Error(...)
,但对于自定义错误,我发现以下代码运行良好,仍然可以在V8上提供堆栈跟踪,即在Chrome和node.js中(您不会得到)只需按照另一个答案中的建议调用Error.apply()
:
function CustomError(message) {
// Creates the this.stack getter
if (Error.captureStackTrace) Error.captureStackTrace(this, this.constructor)
this.message = message;
}
CustomError.prototype = Object.create(Error.prototype);
CustomError.prototype.constructor = CustomError;
CustomError.prototype.name = 'CustomError';
有关详细信息,请参阅以下链接:
答案 2 :(得分:0)
function CustomError() {
var returned = Error.apply(this, arguments);
this.name = "CustomError";
this.message = returned.message;
}
CustomError.prototype = Object.create(Error.prototype);
//CustomError.prototype = new Error();
var nie = new CustomError("some message");
console.log(nie);
console.log(nie.name);
console.log(nie.message);
答案 3 :(得分:0)
此脚本描述了在JavaScript中创建和使用自定义错误的所有可能机制。
另外,为了全面理解,必须了解JavaScript中的原型继承和委托。 我写了这篇文章,清楚地解释了它。 https://medium.com/@amarpreet.singh/javascript-and-inheritance-90672f53d53c
我希望这会有所帮助。
function add(x, y) {
if (x && y) {
return x + y;
} else {
/**
*
* the error thrown will be instanceof Error class and InvalidArgsError also
*/
throw new InvalidArgsError();
// throw new Invalid_Args_Error();
}
}
// Declare custom error using using Class
class Invalid_Args_Error extends Error {
constructor() {
super("Invalid arguments");
Error.captureStackTrace(this);
}
}
// Declare custom error using Function
function InvalidArgsError(message) {
this.message = `Invalid arguments`;
Error.captureStackTrace(this);
}
// does the same magic as extends keyword
Object.setPrototypeOf(InvalidArgsError.prototype, Error.prototype);
try{
add(2)
}catch(e){
// true
if(e instanceof Error){
console.log(e)
}
// true
if(e instanceof InvalidArgsError){
console.log(e)
}
}