单个CATCH块可捕获try块中的多少个异常?
问题解答
单个CATCH块的异常捕获规则
- 同一块级作用域下的单个
CATCH块,默认只能捕获当前块执行过程中第一个抛出的异常,无法捕获同一段顺序执行代码里的多个异常:异常抛出的瞬间会立刻中断当前块的后续执行流程,直接把控制权转交给对应的CATCH处理块,异常抛出点之后的代码不会运行,自然不会产生后续异常。
特殊情况:如果在CATCH处理逻辑中调用resume让执行流回到异常抛出点继续向后运行,后续代码执行抛出的新异常会再次触发同一个CATCH块,这种场景下单个CATCH块可以依次捕获多个连续抛出的异常。 - 不需要为每一种可能的异常类型单独配置独立的
CATCH块。单个CATCH块内可以通过when分支匹配不同类型的异常,分别编写处理逻辑即可,完全能覆盖多异常类型的处理需求。
示例代码执行逻辑说明
测试代码如下:
try { CATCH { default { say "seenError"; }; }; die "1"; die "2"; die "3" } # 运行输出:seenError
- 本次运行中被捕获的就是第一条
die "1"抛出的异常。执行到die "1"时异常立刻触发,后续的die "2"、die "3"根本没有执行机会,不会产生异常。 - 注意:
CATCH块是块级作用域的处理器,不管写在所属块的开头、中间还是结尾,都会捕获整个块执行过程中抛出的异常,和书写位置没有关系。
多异常单独处理的配置要求
不需要为每一个可能抛出异常的语句单独配置独立CATCH块,按实际场景选择方案即可:
- 如果只是需要按异常类型区分处理逻辑,在同一个
CATCH块内编写分支匹配逻辑就足够。 - 如果需要对不同语句抛出的同类型异常做差异化处理,或者需要前一个异常被处理后继续执行后续语句、抛出后续异常,才需要把对应语句包裹在独立的、自带
CATCH处理器的代码块中。
内容的提问来源于stack exchange,提问作者lisprogtor
相关产品推荐
相关产品推荐

