Как я могу предотвратить завершение моего perl-скрипта, если в используемом модуле выдается исключение? - PullRequest
3 голосов
/ 01 декабря 2011

У меня есть Perl-скрипт, использующий стандартный как HTTP-код Net :: HTTP и Perl 5.8.8.Я столкнулся с ошибкой, при которой сервер возвращает 0 байтов данных при вызове:

$_http_connection->read_response_headers;

К сожалению, мой Perl-скрипт die s, потому что модуль Net :: HTTP :: Methods имеет"die" в строке 306:

Server closed connection without sending any data back at
/usr/lib/perl5/vendor_perl/5.8.8/Net/HTTP/Methods.pm line 306

И строки 305-307, конечно:

unless (defined $status) {
die "Server closed connection without sending any data back";
}

Как я могу сделать так, чтобы мой сценарий "изящно" восстановился из этой ситуации,обнаружение die и последующее использование моего собственного кода обработки ошибок вместо die самого себя?

Я уверен, что это распространенный случай, и, вероятно, что-то простое, но я не пришелчерез это раньше.

Ответы [ 3 ]

12 голосов
/ 01 декабря 2011

Использование eval для отлова исключений может иногда вызывать проблемы , особенно до 5.14.Вы можете использовать Try :: Tiny .

11 голосов
/ 01 декабря 2011

Вы можете использовать eval { } для перехвата die() исключений.Используйте $@, чтобы проверить выброшенное значение:

eval {
    die "foo";
};
print "the block died with $@" if $@;

Подробнее см. http://perldoc.perl.org/functions/eval.html.

2 голосов
/ 01 декабря 2011

Настроить die для обозначения чего-то другого просто:

sub custom_exception_handler { ... } # Define custom logic

local $SIG{__DIE__} = \&custom_exception_handler;  # Won't die now
# Calls custom_exception_handler instead

Большим преимуществом этого подхода перед eval является то, что для выполнения проблемного кода не требуется вызова другого интерпретатора perl.

Разумеется, пользовательский обработчик исключений должен соответствовать поставленной задаче.

...