try/catch/finally语句是javascript的异常处理机制。其中try从句定义了须要处理的异常所在的代码块。catch从句跟随在try从句以后,当try块内某处发生了异常时,调用catch内的代码逻辑。catch从句后跟随finally块,后者中放置着清理代码。无论try块中是否产生异常,finally块内的逻辑老是会执行。javascript
try{java
//一般来说,这里的代码会从头执行到尾而不产生任何问题;对象
//但有时会抛出一个异常,要么是由throw语句直接抛出异常,要么是经过调用一个方法间接抛出异常ip
}io
catch(e){function
//当且仅当try语句块抛出异常,才会执行这里的代码变量
//这里能够经过局部变量e来得到对Error对象或者抛出的其余值得引用引用
//这里的代码块能够基于某种缘由处理这个异常,也能够忽略这个异常程序
//还能够经过throw语句从新抛出异常方法
}
finally{
//无论try语句是否抛出了异常,这里的逻辑总会执行,终止try语句块的方式有:
// 1) 正常终止,执行完语句块的最后一条语句
// 2) 经过break、continue或return语句终止
// 3) 抛出一个异常,异常被catch从句捕获
// 4) 抛出一个异常,异常未被捕获,继续向上传播
}
这里有个关于try/catch语句更实际的例子
try{
var n=Number(prompt("请输入一个正整数",""));
var f=factorial(n);
alert( n+" !=" +f);
}
catch(ex){
alert(ex); //若是输入不合法,将执行这里的逻辑
}
一般状况下,解释器执行到try块的尾部,而后开始执行finally的逻辑,一遍进行必要的清理工做。当因为return、continue或break语句使得解释器跳出try语句块时,解释器在执行新的目标代码以前先执行finally块中的逻辑。
若是在try语句块中产生了异常,并且存在一条与之相关的catch从句处理这个异常,解释器首先会执行catch中的逻辑,而后执行finally中的逻辑。若是不存在处理异常的局部catch从句,解释器会首先执行finally中的逻辑,而后向上传播这个异常,直到找到能处理这个异常的catch从句。
若是finally块中使用了return、break或continue、throw语句使程序发生跳转,或者经过调用了抛出异常的方法改变了程序的执行流程,无论这个跳转使程序挂起仍是继续执行,解释器都会将其忽略。例如,若是finally从句抛出一个异常,这个异常将代替正在抛出的异常。若是finally从句运行到了return语句,尽管已经抛出了异常且这个抛出的异常尚未处理,这个方法依然正常返回。
var foo = function(){
try{
//抛出一个异常
}
finally{
return 1; // 未处理异常直接返回,这里将正常返回
}
}