try/catch语句
try/catch作为JavaScript处理异常的一种的方式,使用方法跟很多语言都是一样的。
try{
// 未知的代码
}
catch(error){
// 代码异常时所要做的事
}
任何可能出错的代码放在try代码块里面,处理异常的代码就放在catch代码块里面。只要try代码块里面的代码出现了错误,就会直接执行退出,跳到catch里。catch接受一个参数对象,代码异常跳到catch时,该对象接收一个发生错误的的信息。
catch和其他的语言有点不一样,就算你不使用错误对象,你也必须要给他定义。否则就会抛出安全错误信息。错误对象的错误信息因浏览器而不一样。每个浏览器对错误对象都有自己的定义,可能有部分相同,都有自己的属性定义。但至少的都保存有保存错误信息的message的属性。message属性时唯一一个在主流浏览器同时存在的的属性。
try{
...
}catch(error){
console.log(error.message); // 显示错误原因的信息
console.log(error); // 也可以直接输出显示整个错误对象
}
IE添加了description属性(其值始终等于message)和number属性(它包含内部错误号)。Firefox添加了fileName、lineNumber和stack(包含栈跟踪信息)属性。Safari添加了line(行号)、sourceId(内部错误号)和sourceURL属性。为了让不同的浏览器都可以运行,使用message属性是很不错的选择。
finally 子句
在try/catch语句中,finally子句是可选的,只要写上子句,不管try/catch怎么运行,子句都会执行。
try{
// 未知的代码
return 1;
}
catch(error){
// 代码异常时所要做的事
return error;
}finally{
// 子句
return 2;
}
上面的一段代码,怎么看return都是会返回1,但是返回的时侯永远是2,try模块和catch模块阻止不了子句的运行,return语句也不可以。就选try模块里的代码出现异常,运行catch模块的代码,子句同样的还是会运行。finally子句的存在,让引擎忽略掉了try模块和catch模块里面的return语句。所以只要写上finally子句,返回的永远是子句里的return返回的。
错误类型
代码运行过程中会发生各种各样的异常,每一种异常会抛出一种错误异常。
- Error
- InternalError
- EvalError
- RangeError
- ReferenceError
- SyntaxError
- TypeError
- URIError
Error:是基类型,其他错误类型继承该类型。一般是不会抛出这个错误类型的,这个类型错误是开发者抛出自定义错误。
InternalError:这个类型错误是JavaScript底层发生错误有浏览器抛出的错误,一般显示这个错误类型的话,就是你的代码存在危险行为。也就是递归过多导致栈溢出。
EvalError:在使用eval()函数时不直接调用产生。还有一种是给eval()赋值会抛出错误。简单说呢,就是只要不把eval()当成函数直接使用,救会抛出这个错误。在实践中借本不会使用这个函数,所以基本见不到这个错误。
RangeError :会在超出数值的限制时抛出。例如:数组
new Array(-1);
// 控制台抛出的一种错误消息
Uncaught RangeError: Maximum call stack size exceeded
因为数组没有这个长度的定义,所以就会抛出RangeError错误。或者说给的长度值超出了数组的最大长度值,也是会抛出错误。一般说只要正确的赋值是不会出现什么问题的。
ReferenceError :在找不到对象时抛出错误,这个问题经常是在使用了还没有赋值的变量抛出。
SyntaxError :一般是在给eval()传入的字符串包含JavaScript语法错误时发生。因为JavaScript代码中的语法错误会导致代码无法执行。,所以一般情况下是不会见到它的,因为eval()也是不经常用到的。
eval("a ++ b"); // SyntaxError
TypeError :类型错误。这是在实践中经常能看到的一种错误。抛出的原因也是比较多,主要是在使用特定类型的操作的是时候变量的类型不符合时抛出。访问不存在的方法时也会抛出。
new 10;
Uncaught TypeError: 10 is not a constructor at ***
URIError :只会在使用encodeURI()或decodeURI()但传入了格式错误的URI时发生。这个错误应该是JavaScript中非常难得一见的错误了。
不同的类型错误会抛出不同的类型错误信息,这样就更加方便的让开发者去修改错误了。
在try/catch模块中,可以使用instanceof来判断错误信息的类型。
try{
// 未知的代码
return null;
}
catch(error){
// 代码异常时所要做的事
if(error instanceof TypeError){
// 类型错误,然后下面就是写处理类型错误的代码,再返回就可以了
}else if(...){
...
}
}
try/catch最好是用在自己无法掌握的代码的上。例如你需要调用某个库的某个函数,但是哪个函数有可能会由于一些原因会发生错误,这时候就有必要使用try/catch来把函数包装起来,进行处理。
在明知道的这是会发生错误的情况下,就不需要用到try/catch了,这时候应该找出错误并把代码修改过来。