Можно ли перехватывать сообщения die, которые происходят внутри другого модуля perl?

У меня есть клиент SOAP, написанный на Perl, использующий пакет LWP для транспорта HTTPS и пакет XML::Simple для разбора полезной нагрузки XML. Время от времени вызов XMLin завершается с ошибкой die(), после чего мой сценарий умирает, и его приходится перезапускать программой мониторинга, которую я написал для обнаружения этого. Это действительно нежелательно, и поэтому мне было интересно, есть ли в Perl какие-либо средства, такие как механизм обработки исключений C++, где я могу перехватывать сообщение die, игнорировать его, сообщать об ошибке и позволять моему сценарию продолжаться так же, как если бы произошла ошибка? Я прочитал несколько книг по Perl и искал это, но ничего не нашел. Это убивает мое приложение, но я не хочу писать свой собственный код синтаксического анализа XML, если в этом нет крайней необходимости.


person mathematician1975    schedule 03.07.2012    source источник
comment
Используйте библиотеку SOAP высокого уровня, такую ​​как SOAP::Lite, которая поставляется с собственными обработчиками ошибок.   -  person daxim    schedule 03.07.2012


Ответы (2)


Да; базовым механизмом для этого будет eval:

sub a { die "BAD"; }
eval { a(); }
print "Survived an exception $@";

Однако есть причины, по которым вам следует использовать более высокоуровневые конструкции (которые, тем не менее, построены поверх этого), например Try::Tiny и др. (см. ссылки внизу его документации).

person jpalecek    schedule 03.07.2012
comment
Спасибо, я попробую. - person mathematician1975; 03.07.2012

Вы можете поймать «умереть», но вы не можете остановить свой скрипт от смерти, перехватив его: сам выходит через "goto", выход из цикла или "die()".*

Однако вы можете запускать подпрограммы, которые могут вызывать die() внутри блока eval{}.

person fork0    schedule 03.07.2012
comment
Таким образом, мой скрипт завершается всякий раз, когда пакет сталкивается с условием, вызывающим die() ?? Я вообще ничего не могу сделать? Ну что ж, похоже, мне лучше начать с версии C++.... - person mathematician1975; 03.07.2012
comment
ну да, кроме того эвала, о котором тебе уже два раза сказали - person fork0; 03.07.2012