try
不仅可以和 catch
搭配食用,还有一个 finally
语句块。
try {
console.log('try块内log')
return 'try中的return'
} catch (error) {
console.log('catch块内log')
} finally {
console.log('finally块内log')
return 'finally中的return'
}
它会先于 try
语句块的 console.log()
执行,后与 try
语句块的 return
执行。
打印结果:
代码语言:javascript复制try块内log
finally块内log
finally中的return
但是,如果开启了 ESLint,上面的代码会报错。
error: Unsafe usage of ReturnStatement (no-unsafe-finally) at ...
因为 JavaScript 会暂停 try
和 catch
语句块中的控制流语句,直到 finally
语句块执行完毕。
所以,当 return
、throw
、break
和 continue
出现在 finally
中时, try
和 catch
语句块中的控制流语句将被覆盖,这被认为是意外的行为。比如:
(() => {
try {
return 1;
} catch(err) {
return 2;
} finally {
return 3;
}
})();
// > 3
如果 finally
语句块中有 return
,会阻止程序继续执行,也就是说无法正常完整的执行 try
语句块中的流程,所以 ESLint 不允许在 finally
中使用 return
,会报错提示“不安全的用法”。
未经允许不得转载:w3h5 » try...finally报错:Unsafe usage of ReturnStatement