eval { open my $fh, '>', $file or die "Could not open file! $!"; }; if( $@ ) { # catch and handle error }
Блоки eval { ... } могут быть вложенными. И, если вызывать die() без аргумента, то используется текст предыдущей ошибки с добавлением строки "\t...propagated" (+ номер строки скриптa + "\n"):
eval { eval { eval { open my($fh), ">", "/etc/passwd" or die "$!" }; if( $@ ) { die } }; if ( $@ ) { die } }; if( $@ ) { print "Error: $@" } Error: Permission denied at -e line 3. ...propagated at -e line 4. ...propagated at -e line 6.
Строка - не всегда удобный способ передачи информации об ошибке. Аргументом die() может быть ссылка, а значит и объект. Если вызов происходит внутри блока eval, $@ будет содержать ссылку/объект, содержащий нужную информацию об ошибке. В этом случае правда придется перегружать оператор '"' (для объекта), чтобы необработанные ошибки выводились нормальной строкой.