try/catch语句

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了,这时候应该找出错误并把代码修改过来。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值