try…catch 语句

用来测试代码中的错误,try 部分包含需要运行的代码,而 catch 部分包含错误发生时运行的代码。

用法

1
2
3
4
5
try {
//可能会导致错误的代码
} catch (error) {
//在错误发生时怎么处理
}

实例

1
2
3
4
5
try {
window.someNonexistentFunction(); //调用不存在的函数
} catch (error) {
alert('An error happened!');
}

finally子句

虽然在try-catch语句中是可选的,但finally子句一经使用,其代码无论如何都会执行。换句话说,try语句块中的代码全部正常执行,finally子句会执行;如果因为出错而执行了catch语句块,finally子句照样还会执行。只要代码中包含finally子句,则无论try或catch语句块中包含什么样的代码——甚至return语句,都不会阻止finally子句的执行。来看下面这个函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
try{ 
//再此执行代码,如果发生异常直接跳入catch,下面代码不在执行
}

catch(error){
//error自定义错误输出信息 需要与thow配合使用
}

finally {
//finally 可用可不用但是只要用了, try语句块中的代码全部正常执行,finally会执行;
//如果因为出错 而执行了catch语句块finally照样还会执行,代码中包含finally,
//那么无论try还是catch语句块中的return语句将被忽略。
}
/*
执行顺序为:首先执行try语句块中的代码,如果抛出异常,接着执行catch语句块中代码,如果
没有异常,catch语句块中代码将会被忽略,但不管是否有异常,最后最会执行finally子句。
try后面必须接着一个catch或者finally,也就是可以有3中组合形式。即try-catch、
try-finally、try-catch-finally三种形式。 */

错误类型

1, Error
基类型,主要目的供开发人员抛出自定义错误。
2, EvalError
使用eval()函数而发生异常时抛出,eval() 函数可计算某个字符串,并执行其中的的代码。
3, RangeError
会在数值超出相应范围时触发。
4, ReferenceError
在找不到对象的情况下会发生ReferenceError,通常在访问不存在的变量时,就会发生这种错误
5, SyntaxError
把语法错误的字符串传入eval()函数时,就会导致此类错误
6, TypeError
执行特定于类型的操作时,变量的类型并不符合要求所致。
7, URIError
使用encodeURI()或decodeURI(),而URI格式不正确时,就会导致此错误

抛出错误

  与try-catch语句相配的还有一个throw操作符,用于随时抛出自定义错误。抛出错误时,

必须要给throw操作符指定一个值。这个值是什么类型,没有要求。
在遇到throw操作符时,代码会立即停止执行。仅当有try-catch语句捕获到被抛出的值时
,代码才会继续执行。
创建自定义错误消息时,最常用的错误类型是Error、RangeError、ReferenceError和TypeError。
另外,利用原型链还可以通过继承Error来创建自定义错误类型。此时,需要为新创建的错误类型指
定name和message属性。

try-catch使用考量

  使用try-catch最适合处理那些我们无法控制的错误,假设你在使用一个大型库中的函数,

该函数可能会有意无意地抛出一些错误。由于不能修改这个库的源代码,所以大可将对该
函数的调用放在try-catch语句当中。万一有什么错误发生,也好恰当地处理它们。

  明明白白地知道自己的代码会发生错误时,再使用try-catch语句就不太合适了。例如,如果

传递给函数的参数是字符串而非数值,就会造成函数出错,那么就应该先检查函数的类型,然
后再决定如果去做。在这种情况下,不应该使用try-catch语句。