Try::Tiny: Странное поведение с try-catch или нет?

Я использую Try::Tiny для попробовать-поймать.

Код выглядит так:

use Try::Tiny;

try {
    print "In try";
    wrongsubroutine();  # undefined subroutine
}
catch {
    print "In catch";
}

somefunction();

...

sub somefunction {
    print "somefunction";
}

Когда я выполняю это происходит так:

somefunction
In Try
In catch

Выходная последовательность выглядит неправильно для меня. Это неправильно? или это нормальное поведение?

2 ответа

Решение

Так же, как забыть точку с запятой в

print
somefunction();

вызывает вывод somefunction быть переданным print вместо $_пропущенная точка с запятой приводит к выводу somefunction быть передан в качестве аргумента catch,

try {
   ...
}
catch {
   ...
};      <--------- missing
somefunction();

try а также catch подпрограммы с &@ прототип. Это означает

try { ... } LIST
catch { ... } LIST

такой же как

&try(sub { ... }, LIST)
&catch(sub { ... }, LIST)

Так что ваш код такой же, как

&try(sub { ... }, &catch(sub { ... }, somefunction()));

Как видите, пропущенная точка с запятой после catch блок вызывает somefunction быть вызванным раньше catch (который возвращает объект, который говорит try что делать в исключительных случаях) и try,

Код должен быть

&try(sub { ... }, &catch(sub { ... })); somefunction();

что достигается путем размещения точки с запятой после вызова try-catch.

Какую последовательность вы ожидаете? Ваш код действительно пропускает точку с запятой после catch код?

Другие вопросы по тегам