Saturday, September 5, 2009

Исключения (exceptions) в Перле

В Перле нет исключений, т.е. они не являются частью языка. Но, исключения можно успешно имитировать простой связкой eval + die.

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, $@ будет содержать ссылку/объект, содержащий нужную информацию об ошибке. В этом случае правда придется перегружать оператор '"' (для объекта), чтобы необработанные ошибки выводились нормальной строкой.

No comments:

Post a Comment