简单说下try...catch...finally 的执行顺序

在开发的过程中,我们通常会使用try、catch、finally来处理异常情况。

前几天同事在面试完后说他问了一个简单的问题:简单说一下try、catch、finally的执行顺序,能完全回答上来的人并不多。

我们都知道加trycatch,当try中出现异常时catch中会捕获到该异常,finally无论是否有异常抛出或捕获它总是执行,往往却忽略了一些细微的点

try...catch...finally 的执行顺序

1. try中抛出异常,则跳转到catch,如果catch中出现异常则跳转到finally;

2. try或着catch正常执行,如果存在return,则先执行return,再执行finally;

3. 如果finally中出现异常或着包含return,则执行结束;如果没有异常且没有return,则会执行try或catch中的return或结束;

代码说明:

1. 当try...catch...finally中没有return时,try出现异常进入catch,执行完catch后进入finally,如果catch中出现异常也会执行finally,finally执行结束后抛出异常;如果try中无异常,执行完try后执行finally;

try {
   throw new Error("KFC Crazy Thursday need 50¥");
}
catch (ex) {
   console.log("error:", ex.message);
}
finally {
   console.log("finally");
}

  

2. try或catch中有return,先执行return,并保存返回值信息,finally依然执行,finally执行结束后,输出返回值;

function myFun(x) {
    try { 
        if(x == "")  throw "为空";
        if(isNaN(x)) throw "不是一个数字";
        if(x > 10)   throw "太大";
        if(x < 5)    throw "太小";
        console.log('x = ', x)
        return 1
    }
    catch(err) {
        console.log('输入的值:', err)
	    return 2
    }
    finally {
        console.log('finally')
    }
}

myFun('')
myFun(6)

   

 3. 当finally中存在return,会覆盖try或catch中返回的数据,如果catch中抛出异常会将该异常覆盖掉;

function myFun(x) {
    try { 
        if(x == "")  throw "为空";
        if(isNaN(x)) throw "不是一个数字";
        if(x > 10)   throw "太大";
        if(x < 5)    throw "太小";
        console.log('x =', x)
        return 1
    }
    catch(err) {
        console.log('输入的值: ', err)
	    return 2
    }
    finally {
        console.log('finally')
        return 3
    }
}
myFun(4)
myFun(8)

   

如果try或着catch需要返回值,就不能在finally中加return,加return的话程序提前退出,返回值就不是try或catch中的值;

猜你喜欢

转载自blog.csdn.net/srj15110129498/article/details/127672097
今日推荐