为何_test函数最终返回finaly?我们不是已捕获抛出的错误吗?
核心执行规则
出现这种返回结果是编程语言的明确语法规则决定的,和catch块是否成功捕获错误没有直接关联。
对应的测试示例代码:
String _test(){ try { throw Exception('error'); } catch (e) { return 'catch'; } finally { return 'finaly'; } }
逐行执行流程拆解
- 程序进入
try块,执行到throw Exception('error')时直接抛出异常,中断try块内的后续代码执行 - 抛出的异常被
catch (e)块成功捕获,进入catch块执行return 'catch':此时程序不会立刻将'catch'作为最终结果返回,只会将这个值暂存为待返回值,按照语法规则强制执行完关联的finally块后才会真正退出函数 - 进入finally块执行到
return 'finaly':该return语句会直接覆盖之前所有暂存的待返回值,将'finaly'作为函数的最终返回值直接退出,不再理会catch块暂存的返回结果
关键认知澄清
- finally块的return语句拥有最高返回优先级:哪怕是try块正常执行完毕的return、catch块捕获异常后的return,只要finally块中存在return语句,都会被finally的返回值覆盖
- 在finally块中写return属于典型的不良实践:不仅会制造反直觉的返回逻辑,还会直接吞掉本该向上抛出的未处理异常、覆盖正常的错误返回逻辑,绝大多数代码静态检查工具都会对这类写法发出警告
内容的提问来源于stack exchange,提问作者rozerro
相关产品推荐
相关产品推荐

