引言
今天来和大家一起学习一下JavaScript中的Error类。
Error类
JavaScript中的throw和catch语句可以抛出和捕获任何JavaScript的值,包括原始值等。虽然没有用来表示错误的异常类型,但是JavaScript中定义了一个Error类。惯用的做法是使用Error类或其子类的实例作为throw抛出的错误。使用Error对象的一个主要原因就是在创建Error对象时,该对象能够捕获JavaScript的栈状态,如果异常没有被捕获,则会显示包含错误消息的栈跟踪信息,而这对排查错误很有帮助。(栈跟踪信息会展示创建Error的地方,而不是throw语句抛出他的地方。)
Error对象有两个属性:message和name,还有一个toString()方法。message属性的值是我们传给Error()构造函数的值。必须时会被转换为字符串,对使用Error()创建的错误对象,name属性的值始终是"Error"。toString()方法返回一个字符串,由name属性的值的后面跟一个冒号和一个空格,然后跟着message属性的值构成。
虽然ECMAScript标准中没有定义,但是Node和所有现代浏览器也都在Error对象上定义了stack属性。这个属性的值是一个多行字符串,包含创建错误对象时JavaScript调用栈跟踪信息。在捕获到异常错误时,可以将这个值的信息作为日志收集起来。
除了Error类,js中还定义了一些他的子类,以便于出啊发ECMAScript定义的一些特殊类型的错误。这些子类包括:EvalError,RangeError,ReferenceError,SyntaxError,TypeError和URIError。你可以按照自己认为合适的方法在代码中使用这些错误类。与基类Error一样,这些子类也都有一个构造函数,接收一个消息参数,每个子类的示例都有一个name属性,其值就是构造函数的名字。
作为开发者,我们可以自己定义Error的子类,以便于更好的封装自己程序的错误信息。自定义的错误对象可以不限于message和name属性。在定义自己的子类的时候,可以任意添加新属性以提供更多的错误细节。
实例
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");
error.status;
error.statusText;
error.url;