JavaScript的Error类

       Javascript的throw和catch语句可以抛出和捕获任何Javascript值,包括原始值。虽然没有用来表示错误的异常类型,但Javascript定义了一个Error类。惯常的做法是使用Error类或其子类的实例作为throw抛出的错误。

       

        使用Error对象的一个主要原因就是在创建Error对象时,该对象能够捕获Javascript的栈状态,如果异常未被捕获,则会显示包含错误信息的栈跟踪信息,而对这排查错误很有帮助(注意,栈跟踪信息会展示创建Error对象的地方,而不是throw语句抛出它的地方。如果你始终在抛出之前创建该对象,如throw new Error(),就不会造成任何困惑)。

        Error对象有两个属性:message和name,还有一个toString()方法。message属性的值是我们传给Error()构造函数的值,必须时会被转换为字符串。对使用Error()创建的错误对象,name属性的值始终是“Error”。toString()方法返回一个字符串,由name属性的值后跟一个冒号和一个空格,再后跟message属性的值构成。

        虽然ECMAScript标准并没有定义,但Node和所有现代浏览器也都在Error对象上定义了stack属性。这个属性的值是一个多行字符串,包含创建错误对象时Javascript调用栈的栈跟踪信息,在捕获到异常错误时,,可以将这个属性的信息作为日志收集起来。

        除了Error类,Javascript还定义了一些它的子类,以便触发ECMAScript定义的一些特殊类型的错误。这些子类包括:EvalError、RangeError、ReferenceError、SyntaxError、TypeError和URIError。你可以按照自己认为合适的方式在代码中使用这些错误类。与基类Error一样,这些子类也都有一个构造函数,接收一个消息参数。每个子类的实例都有一个name属性,其值就是构造函数的名字。

        作为开发者,我们可以自己定义Error类的子类,以便更好地封装自己程序的错误信息。注意,自定义错误对象可以不限于message和name属性。在定义自己的子类时,可以任意添加新属性以提供更多的错误细节。例如,要写一个解析器,可以定义一个ParseError类,并为它定义line和column属性,以表示解析失败的具体位置。如果要使用HTTP请求,可能需要定义一个HTTPError类,这个类通过status属性保存请求失败对应的HTTP状态码(例如404或500)。

例如:

      class HTTPError extends Error{

      constructor(status,statusText,url){

        super(`${status} ${statusText}: ${url}`);

        this.status = status;

        this.statusText = statusText;

        this.url = url;

      }

      get name(){ return "HTTPError" }

    }

    let error = new HTTPError(404,"Not Found", "http://example.com/");

    console.log(error.status);

    console.log(error.statusText);

    console.log(error.name);

标签: JavaScript Error