Ошибка в CATCH - PullRequest
       83

Ошибка в CATCH

5 голосов
/ 28 сентября 2019

Я, вероятно, пропускаю что-то простое, но не ожидаю, что приведенный ниже код даст сбой.Он ведет себя так, как будто я написал die вместо fail в блоке catch.

Ошибка не обрабатывается должным образом, и код умирает.

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

Ответы [ 2 ]

4 голосов
/ 29 сентября 2019

Чтобы донести до поздних читателей всю силу того, что Йода сказал в их комментарии , самое простое решение - отучить идею, что вам нужно try, чтобыCATCH.Вы не:

sub foo() 
{
  say 1 / 0;
  CATCH { default { fail "FAIL" } }
  return True;
}

with foo() { 
    say "done";
}
else
{
  say "handled {.exception.message}"
}

правильно отображает:

handled FAIL
3 голосов
/ 28 сентября 2019

В соответствии с документацией Failure , похоже, это определенное поведение.

Контекст Sink (void) приводит к сбою броска, то есть превращению в нормальное исключение.Использование фатальной прагмы приводит к тому, что это происходит во всех контекстах в рамках прагмы.Внутри блоков try, использование fatal устанавливается автоматически, и вы можете отключить его без фатального исхода.

Вы можете попробовать использовать прагму no fatal.

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

unless foo()  {
     say "handled"
}
...