kot

d11he11


i-t-шные заметки

Teach Yourself Programming in Ten Years


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

?

Log in