Форма BLOCK eval - это встроенный механизм для обработки «исключений» в Perl, то есть die .
. Таким образом, это естественно для«вкладывать» его, в том смысле, что каждый уровень имеет свой собственный
eval { func(...) }; if ($@) { ... }
sub func {
...
eval { func_lower(...) };
if ($@) {
# handle it: recover or re-throw for the higher-level handlers
}
...
}
sub func_lower {
...
eval { func_lower_yet(...) };
if ($@) {
# handle it: recover or re-throw for the higher-level handlers
}
...
}
. Таким образом, на каждом уровне можно решить, можно ли разрешить исключительное поведение, а если нет, то перебросить (выпустить die
снова), поскольку более высокий уровень может быть лучше информирован, чтобы иметь дело с ним.
Исключения в Perl также "всплывают", поэтому, если исключение не обработано на одном уровне, оно распространяется вверх по стеку вызовов, и следующий уровень вверх все еще может с ним работать (программа не завершается доосновной сбит с исключением, которое он не обрабатывает).
Такая типичная структура вложенных вызовов немного забита в вашей последовательности if-elsif, но она все еще соответствует
eval {
if ($condition1) { ... }
elsif ($condition2) {
eval {
...
};
if ($@) {
# issue a warning, perhaps set some flag, and continue
# or throw a die for the higher-level eval
}
}
elsif ...
};
if ($@) {
# interrogate details
}
Теперь вы можете изолировать ошибки от $condition2
, чтобы им не приходилось вызывать внешние eval
.
Обратите внимание, что вы можете "бросать" объекты в die
, например, простого классавы пишете, чтобы собрать воедино ваши потребности, что обеспечивает гораздо большую гибкость для обработчиков.Также обратите внимание, что для этого есть модули CPAN.