为何try里面放return,finally还会执行,理解其内部机制

3,935 阅读1分钟

作用

try...catch语句标记要尝试的语句块,并指定一个出现异常时抛出的响应。

声明

try语句包含了由一个或者多个语句组成的try块,

和至少一个catch子句或者一个finally子句的其中一个,或者两个兼有, 下面是三种形式的try声明:

  • try...catch
  • try...finally
  • try...catch...finally
try{
    console.log('begin throw error')
    throw 'this is a error'
    console.log('Will it work here ? ')
} catch(e){
    console.log('e:',e)
}

//打印结果
begin throw error
e: this is a error

从结果可以看到

如果在try块中有任何一个语句(或者从try块中调用的函数)抛出异常,控制立即转向catch子句。

finally语句

function foo(){
   try{
     return 0;
   } catch(err) {
       //TODO
       return 1;
   } finally {
     console.log("a")
   }
}

console.log(foo());
 
//打印结果
a
0
 

可以看到先执行finally 在执行try里面的return

function foo(){
    try{
        throw 'this is a error'
    } catch(e) {
        //TODO
        console.log('e:',e)
        return 1;
    } finally {
      console.log("a")
    }
}

console.log(foo());

//打印结果
e: this is a error
a
1

可以看到 先执行return之前的语句 再执行finally 最后执行return


function foo() {
	try {
		// throw 'this is a error'
		return 0;
	} catch (e) {
	} finally {
		console.log("a");
		return "finally end";
	}
}

console.log(foo());

//打印结果
a
finally end

可以看到 finally 里的return"覆盖了"了try中的return

MDN中有一句话:

如果从finally块中返回一个值,那么这个值将会成为整个try-catch-finally的返回值,无论是否有return语句在try和catch中。这包括在catch块里抛出的异常。