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
执行。
打印结果:
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