try/catch/finally语句

try/catch/finally语句是javascript的异常处理机制。其中try从句定义了需要处理的异常所在的代码块。catch从句跟随在try从句之后,当try块内某处发生了异常时,调用catch内的代码逻辑。catch从句后跟随finally块,后者中放置着清理代码。不管try块中是否产生异常,finally块内的逻辑总是会执行。

try{

//通常来讲,这里的代码会从头执行到尾而不产生任何问题;

//但有时会抛出一个异常,要么是由throw语句直接抛出异常,要么是通过调用一个方法间接抛出异常

}

catch(e){

//当且仅当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; // 未处理异常直接返回,这里将正常返回

    }

}

posted @ 2015-12-30 18:48  Roy110  阅读(346)  评论(0编辑  收藏  举报