try…catch…finally的执行顺序
一般使用try...catch
进行异常捕获,当出错时保证代码正常执行。那么,你真正地了解try...catch...finally
的执行顺序吗?
function getValue() {
let count = 0;
try {
console.log('try ' + count);
return ++count;
} finally {
count = 10;
console.log('finally ' + count);
}
}
console.log('result ' + getValue());
输出结果为
try 0
finally 10
result 1
可以看到,finally
里面的代码总是会被执行,即使在try
里面加了return
,finally
还是在try
里面return
之前执行的。
那么,如果在finally
中添加一个return
,输出的又是什么呢?
function getValue() {
let count = 0;
try {
console.log('try ' + count);
return ++count;
} finally {
count = 10;
console.log('finally ' + count);
return count;
}
}
console.log('result ' + getValue());
输出结果为
try 0
finally 10
result 10
结果try
中的return
并没有生效,直接在finally
中return
掉了,返回的finally
的结果。
另外一种情况,如果在catch
中直接return
呢?
function getValue() {
let count = 0;
try {
console.log('try ' + count);
throw new Error('some error');
return ++count;
} catch {
count = 20;
console.log('error ' + count);
return count;
} finally {
count = 10;
console.log('finally ' + count);
return count;
}
}
console.log('result ' + getValue());
输出结果为
try 0
error 20
finally 10
result 10
结果return
的值依然为finally
中return
的值,即使在catch
中加了return
,同样不会返回,执行顺序是try
→ catch
→ finally
。
此时,我推断将finally
中的return
去掉后应该返回的是error
中return
的值。
function getValue() {
let count = 0;
try {
console.log('try ' + count);
throw new Error('some error');
return ++count;
} catch {
count = 20;
console.log('error ' + count);
return count;
} finally {
count = 10;
console.log('finally ' + count);
}
}
console.log('result ' + getValue());
输出结果
try 0
error 20
finally 10
result 20
果然不出所料。
总结
try...catch...finally
包裹的代码段不管如何都会去执行finally
中的代码,如果在finally
中包含了return
,那么返回的肯定是finally
的结果。如果finally
中不存在return
,则返回try
或者catch
中的结果。
如果您觉得本文对您有用,欢迎捐赠或留言~
- 本博客所有文章除特别声明外,均可转载和分享,转载请注明出处!
- 本文地址:https://www.leevii.com/?p=2473