Perl 6中CATCH块用fail未生成Failure却终止程序的问题
问题分析与解决
我一眼就揪出了导致代码行为不符合预期的两个核心问题:
1. CATCH块里的fail会直接抛出异常,而非返回Failure
Perl 6里fail的行为会受上下文影响:在普通代码中它会返回一个Failure对象,但在**异常处理上下文(比如CATCH块)**里,它会自动把生成的Failure当作未处理异常抛出,而不是返回给调用者。这就是程序直接终止的原因——CATCH里的fail抛出的异常没被任何代码捕获,直接传到了程序顶层。
2. 强制return True覆盖了try块的结果
你的代码里,try块执行完后立刻写了return True;,这意味着不管try块里发生什么(哪怕返回了Failure),foo函数都会强制返回True,完全抵消了你想要返回Failure的意图。
修正后的代码方案
方案一:直接返回Failure实例
在CATCH块中手动创建并返回Failure对象,避免使用fail触发自动抛出:
sub foo() { try { say 1 / 0; CATCH { default { return Failure.new("FAIL") } } } } with foo() { say "done"; } else { say "handled {.exception.message}" }
方案二:用return拦截fail的抛出行为
如果你更习惯用fail,可以在CATCH块里直接返回fail的结果——return会终止CATCH块的执行,阻止fail触发异常抛出:
sub foo() { try { say 1 / 0; CATCH { default { return fail "FAIL" } } } } with foo() { say "done"; } else { say "handled {.exception.message}" }
两种方案执行后都会输出:
handled FAIL
完全符合你预期的异常处理逻辑。
内容的提问来源于stack exchange,提问作者Holli
相关产品推荐
相关产品推荐

