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.