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 ответа:
Точно так же, как забыть точку с запятой в
print somefunction();Вызывает передачу вывода
somefunctionв$_, пропущенная точка с запятой вызывает передачу вывода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.