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


Я использую Try::Tiny для try-catch.

Код выглядит следующим образом:

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 3

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?