在javascript中创建自定义错误的正确方法

时间:2014-11-25 02:32:33

标签: javascript

在JavaScript中定义自定义错误的正确方法是什么?

通过SO搜索我发现了大约6种不同的方法来定义自定义错误,但我不确定每种方法的优势(dis)。

从我对JavaScript中原型继承的理解(有限),这段代码应该足够了:

function CustomError(message) {
   this.name = "CustomError";
   this.message = message;
}
CustomError.prototype = Object.create(Error.prototype);

4 个答案:

答案 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';

有关详细信息,请参阅以下链接:

What's a good way to extend Error in JavaScript?

https://plus.google.com/+MalteUbl/posts/HPA9uYimrQg

答案 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)
      }
    }