我可能忽略了一些简单的内容,但是我不希望下面的代码失败。好像我在catch块中写的是die
而不是fail
。
无法正确处理故障并且代码消失。
sub foo()
{
try {
say 1 / 0;
CATCH { default { fail "FAIL" } }
}
return True;
}
with foo() {
say "done";
}
else
{
say "handled {.exception.message}"
}
输出:
FAIL
in block at d:\tmp\x.pl line 5
in any at d:\tmp\x.pl line 5
in sub foo at d:\tmp\x.pl line 4
in block <unit> at d:\tmp\x.pl line 11
根据故障documentation,这似乎是已定义的行为。
接收器(void)上下文会导致失败,即变成正常异常。使用致命的编译指示会导致此情况在编译指示范围内的所有情况下发生。在try块中,使用致命的设置是自动设置的,您可以禁用它而不会致命。
您可以尝试使用no fatal
编译指示。
sub foo() {
try {
no fatal;
say 1 / 0;
CATCH { default { fail "FAIL" } }
}
}
unless foo() {
say "handled"
}
[为了使以后的读者了解what Yoda said in their comment的全部力量,最简单的解决方案是unlearn必须要try
才能获得CATCH
的概念。您不:
sub foo()
{
say 1 / 0;
CATCH { default { fail "FAIL" } }
return True;
}
with foo() {
say "done";
}
else
{
say "handled {.exception.message}"
}
正确显示:
handled FAIL