目录
js中异常(exception)与捕获
代码在运行过程中得到的中间结果与预期的结果不一致,就是异常。一般运行环境会抛出一个提示对象,中断程序运行,这个就是异常机制。换句话说,就是在程序执行过程中,即使程序出错,也能保证不会异常中断的机制。其中包括Error对象、使用throw语句抛出异常、(try...catch...finally语句)、等。
1、Error对象
try...catch...finally语句中的catch通常捕捉到的对象为Error对象,当运行JavaScript代码时,如果产生了错误或者异常,JavaScript就会生成一个Error对象的实例来描述错误。该实例包含了一些特定的错误信息。
Error:封装错误信息的对象,在发生错误时,自动创建,有两个属性:
err.name :错误的名称/错误的类型
err.message: 错误的提示信息
2、throw
有些JavaScript代码没有语法上的错误,但是存在逻辑错误,对于这种错误,JavaScript不会抛出异常,这时候我们可以自己定义一个error对象的实例,并使用throw语句来主动抛出异常。在程序中我们可以通过使用throw语句有目的的抛出异常,其语法格式如下。
throw new Error("errorstatements")
参数说明:throw:抛出异常关键字
throw exception
异常可以是 JavaScript 字符串、数字、逻辑值或对象
var a=5;
if(a==5){
throw new Error("输入5会出错!")
}
程序不会执行,控制台提示Uncaught Error,结果如下:
那么如何去捕获异常呢?这时候就要用到异常处理机制 (try…catch…finally)
3、异常处理机制 (try…catch…finally)
try一旦捕获到异常就要交给catch块进行处理,catch里面有一个封装了错误信息的对象,主要是负责输出错误信息。
如下面例子中,要求用户输入一个偶数,对用户输入的数字进行判断,如果不是偶数,则抛出异常;是偶数则除以2输出;
//先将疑似错误的代码段放入try,一旦出现错误则其他语句不能执行;
try{
var num=prompt("请输入一个偶数:");
if(num%2!=0){
throw new Error("出错啦,输入的不是偶数");//使用throw语句来主动抛出异常。
}else{
console.log("输出该偶×2的值="+num/2);//若输入偶数则输出num/2
}
}
//try 中的语句发生错误,则执行 catch中的语句
catch(e){
console.log("错误信息:"+e.message);
}
//不管try中有没有错误,catch有没有执行,最后一定会执行finally的后期处理代码
finally{
console.log("不管代码有没有出现异常,我都会执行。");
}
运行结果为:
第一种情况:输入偶数
我们可以看到,这里程序正常执行,没有捕获到异常,finally语句也要执行。
第二种情况:输入奇数
这里捕捉到异常,并执行了catch和finally中的语句 。
执行步骤:
分析可知,当try语句块中包含的语句出现错误的时候,跳出try语句执行catch语句块中的内容,然后如果存在finally语句块,则最后执行finally语句块中的内容。
4、使用异常处理需要注意的问题
(1)try中尽量少的包含语句
原因是因为,try语句要经过计算机的检测看看是否是错误的语句,如果是错误的语句则会执行catch里面的语句,如果try的语句过多的话,计算机处理速度就会变慢,影响程序的执行。
(2)如果已经提前预知错误的类型,就用if...else...来代替try...catch
除掉错误预知的这个前提下,if..else..的用法与try...catch...的用法是基本相同的,严格意义来说,if..else..的可读性比try..catch..更强,语句理解能力也更好,开发人员与用户更加倾向于使用if..else.. 但是如果无法判断语句是否正确的话,仍然使用try..catch...会更加严密。就如同前面判断偶数的例子。