当try/catch 中发生错误时,浏览器会认为错误被处理了,因此就不会再使用本章前面提到的机
制报告错误。如果应用程序的用户不懂技术,那么他们即使看到错误也看不懂,这是一个理想的结果。
使用try/catch 可以针对特定错误类型实现自定义的错误处理。
try/catch 语句最好用在自己无法控制的错误上。例如,假设你的代码中使用了一个大型JavaScript
库的某个函数,而该函数可能会有意或由于出错而抛出错误。因为不能修改这个库的代码,所以为防止
这个函数报告错误,就有必要通过try/catch 语句把该函数调用包装起来,对可能的错误进行处理。
如果你明确知道自己的代码会发生某种错误,那么就不适合使用try/catch 语句。例如,如果给
函数传入字符串而不是数值时就会失败,就应该检查该函数的参数类型并采取相应的操作。这种情况下,
没有必要使用try/catch 语句。
抛出错误
与try/catch 语句对应的一个机制是throw 操作符,用于在任何时候抛出自定义错误。throw 操
作符必须有一个值,但值的类型不限。下面这些代码都是有效的:
throw 12345;
throw “Hello world!”;
throw true;
throw { name: “JavaScript” };
使用throw 操作符时,代码立即停止执行,除非try/catch 语句捕获了抛出的值。
可以通过内置的错误类型来模拟浏览器错误。每种错误类型的构造函数都只接收一个参数,就是错
误消息。下面看一个例子:
throw new Error(“Something bad happened.”);
以上代码使用一个自定义的错误消息生成了一个通用错误。浏览器会像处理自己生成的错误一样来
处理这个自定义错误。换句话说,浏览器会像通常一样报告这个错误,最终显示这个自定义错误。当然,
使用特定的错误类型也是一样的,如以下代码所示:
throw new SyntaxError(“I don’t like your syntax.”);
throw new InternalError(“I can’t do that, Dave.”);
throw new TypeError(“What type of variable do you take me for?”);
throw new RangeError(“Sorry, you just don’t have the range.”);
throw new EvalError(“That doesn’t evaluate.”);
throw new URIError(“Uri, is that you?”);
throw new ReferenceError(“You didn’t cite your references properly.”);
自定义错误常用的错误类型是Error、RangeError、ReferenceError 和TypeError。
此外,通过继承Error(第6 章介绍过继承)也可以创建自定义的错误类型。创建自定义错误类型
时,需要提供name 属性和message 属性,比如:
class CustomError extends Error {
constructor(message) {
super(message);
this.name = “CustomError”;
this.message = message;
}
}
throw new CustomError(“My message”);
继承Error 的自定义错误类型会被浏览器当成其他内置错误类型。自定义错误类型有助于在捕获
错误时更准确地区分错误。