js try-catch-finally异常处理语句

js 错误

try catch finally是javascript语言提供的异常处理机制。

1、try-catch

2、finally

3、throw

4、Error



try catch finally是javascript语言提供的异常处理机制。

此语法中除了try以外catch和finally都是可选的(两者必须要有一个)

1、try-catch

捕获异常语句:

为了让程序能正常运行,你可以把你认为有可能出错的代码片放到try里面

try执行到错误语句,会终止执行该语句的下一行,此时会把错误信息打包到Error对象并抛出

错误信息被catch捕捉到,避免输出到控制台阻止下面的程序正常执行;

catch里面可以执行任意的提示语句,但一般是打印出错误信息与提示,如果程序没有错误,则不会执行catch

在catch出现错误仍然会报错,若是没有被捕获,会终止后面的代码运行。

try{
    console.log("a");
    console.log(b); //错误,终止执行
    console.log(c);
}catch(e){
    console.log(e.name + ':' + e.message); // ReferenceError:b is not defined
}
console.log('d'); // 不会影响这行代码执行

 在try-catch外面再套一层try-catch,外层的catch就可以捕获内层catch中的错误信息,从而不影响后面的代码执行。

try{
    try{
        console.log("a");
        console.log(b);  //错误,终止执行
        console.log(c);
    }catch(e){
        console.log(e.name + ':' + e.message);  // ReferenceError:b is not defined
        console.log(d);  //错误,终止执行
        console.log("e"); 
    }
}catch(e){
    console.log(e.name + ':' + e.message);  //捕获内层catch中的错误信息
}
console.log('d');  //不受影响,正常执行

      换句话说try-catch语句可用于容错由于浏览器兼容性问题,以及前后端交互过程中一些意外因素如网络异常,数据传送时间误差,导致一些变量会报错。由于不同浏览器的报错提示是不一样的,根据捕获的浏览器的报错提示判断用户的浏览器,然后做出对应的措施。if通常只能反馈真或假,不能直接反馈浏览器的报错内容。

      try-catch不能做真假判断,只能做非法判断。也就是说:try {1 === 2},虽然1===2是假,但是是合法的,catch不会捕捉到错误,也不会告诉你1 === 2到底是真是假。而if{1 === 2}会直接报错,终止运行。

try{ 
    1 === 2; // 合法 
}catch(e){
    console.log(e.name + ':' + e.message); // 不执行
}


try{
    window.a.b == 1; // 非法
}catch(e){
    console.log(e.name + ':' + e.message); // 执行
}
console.log("a");


if(window.a.b == 1){ // 非法,程序终止运行
    console.log("error");
}
console.log("b"); //无法执行

2、finally

不管try代码块的执行是如何被终止的(出现异常、return、自然终止)finally中的语句始终会被执行,正是由于finally的这种特性,通常finally用来执行一些清理工作。如果try中代码是以return,continue,break的方式终止的,Javascript引擎会在执行完finally中的语句以后再执行相应的try中的返回语句。

try{
    throw new Error('出错了……');
    console.log('此行不会执行');
}finally {
    console.log('完成清理工作');
}

 

以下是几种try-catch-finally的嵌套形式,对比输出顺序。 

// ex1:
try{
    try{
        throw new Error("a");
    }
    finally{
        console.log('finally');
    }
}catch(e){
    console.log(e.message);
}

// finally
// a
//ex2:
try{
	try{
		throw new Error("a");
	}
	catch(e){
		console.log("inner",e.message);
	}
	finally{
		console.log('finally');
	}
}catch(e){
	console.log("outer",e.message);
}
// a
// finally
//ex3:
try{
	try{
		console.log(a);
	}
	catch(e){
		console.log(e.message); // a is not defined
		console.log(b);
	}
	finally{
		console.log('finally'); // finally
		console.log(c);
	}
}catch(e){
	console.log(e.message); //c is not defined,  catch和finally同时有错,只捕捉finally里的错误
}


 

3、throw

throw语句的作用是手动中断程序执行,抛出一个错误。

有些JavaScript代码并没有语法上的错误,但是又逻辑错误,对于这种错误,JavaScript不会抛出异常,这时候需要我们自己定义一个Error对象的实例,并使用throw语句来抛出异常。在程序中我们可以通过使用throw语句有目的地抛出异常,语法格式:throw new Error('somestatements');

手工抛出异常的方法如下:

try{
    throw new Error("Whoops!");
}catch (e) {
    alert(e.name + ": " + e.message);
}

实际上,throw可以抛出任何类型的值。也就是说,它的参数可以是任何值。 

try {
 throw new Date(); // 抛出当前时间对象 
} catch (e) {
 alert(e.toLocaleString()); // 使用本地格式显示当前时间 
}

 本例检测输入变量的值。如果值是错误的,会抛出一个异常(错误)。catch 会捕捉到这个错误,并显示一段自定义的错误消息:

<!DOCTYPE html>
<html>
<body>

<script>
function myFunction(){
    try{ 
        var x=document.getElementById("demo").value;
        if(x=="")    throw "值为空";
        if(isNaN(x)) throw "不是数字";
        if(x>10)     throw "太大";
        if(x<5)      throw "太小";
    }catch(err){
        var y=document.getElementById("mess");
        y.innerHTML="错误:" + err + "。";
    }
}
</script>

<p>请输入 5 到 10 之间的数字:</p>
<input id="demo" type="text">
<button type="button" onclick="myFunction()">测试输入值</button>
<p id="mess"></p>

</body>
</html>

 

4、Error

1、Error实例对象

try...catch...finally语句中的catch通常捕捉到的对象为Error对象,JavaScript解析或运行时,一旦发生错误,引擎就会抛出一个错误对象。

Error对象有以下两个属性:

name:表示异常类型的字符串

message:实际的错误信息

2、六种错误对象

Error实例对象是最一般的错误类型,在它的基础上,JavaScript还定义了其他6种错误对象。也就是说,存在Error的6个派生对象。--

SyntaxError 解析代码时发生的语法错误。

ReferenceError 引用非法或无法识别的变量时或将一个值分配给无法分配的对象。

RangeError 一个值超出有效范围时发生的错误,如数组长度为负数。

TypeError 变量或参数不是预期类型时发生的错误。

URIError URI 相关函数的参数不正确时抛出的错误

EvalError   eval()的使用与定义不一致,该错误类型已经不再使用了,只是为了保证与以前代码兼容,才继续保留。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值