CATCH失败失败

问题描述 投票:5回答:2

我可能忽略了一些简单的内容,但是我不希望下面的代码失败。好像我在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
error-handling perl6
2个回答
3
投票

根据故障documentation,这似乎是已定义的行为。

接收器(void)上下文会导致失败,即变成正常异常。使用致命的编译指示会导致此情况在编译指示范围内的所有情况下发生。在try块中,使用致命的设置是自动设置的,您可以禁用它而不会致命。

您可以尝试使用no fatal编译指示。

sub foo() {
try {
    no fatal;
    say 1 / 0;
    CATCH { default { fail "FAIL" } }
  }
}

unless foo()  {
     say "handled"
}

0
投票

[为了使以后的读者了解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
© www.soinside.com 2019 - 2024. All rights reserved.