PERL: БИБЛИОТЕКА ПРОГРАММИСТА



              

PERL: БИБЛИОТЕКА ПРОГРАММИСТА - стр. 348


die "some message";       # Инициировать исключение

Чтобы перехватить исключение, вызывающая сторона вызывает функцию из eval, после чего узнает результат с помощью специальной переменной $@:

eval  {  func()  }; if ($@)  {

warn "func raised an exception; $@>";


10.12. Обработка исключений   365

Комментарий

Инициирование исключения — крайняя мера, и относиться к ней следует серь­езно. В большинстве функций следует возвращать признак ошибки с помощью простого оператора return. Перехватывать исключения при каждом вызове функ­ции скучно и некрасиво, и это может отпугнуть от применения исключений.

Но в некоторых ситуациях неудачный вызов функции должен приводить к аварийному завершению программы. Вместо невосстановимой функции exit сле­дует вызвать die — по крайней мере, у программиста появится возможность вме­шаться в происходящее. Если ни один обработчик исключения не был установлен с помощью eval, на этом месте программа аварийно завершается.

Чтобы обнаружить подобные нарушения, можно поместить вызов функции в блок eval. Если произойдет исключение, оно будет присвоено переменной $@; в про­тивном случае переменная равна false.

eval { $val = func()  };

warn "func blew up:   $@" if $@;

Блок eval перехватывает все исключения, а не только те, что интересуют вас. Непредусмотренные исключения обычно следует передать внешнему обработчи­ку. Предположим, функция инициирует исключение, описываемое строкой "Full moon!". Можно спокойно перехватить это исключение и дать другим обработчи­кам просмотреть переменную $@. При вызове die без аргументов новая строка ис­ключения конструируется на основании содержимого $@ и текущего контекста.

eval { $val = func()  };

if ($(Э && $(5> Г /Full moon!/)  {

die;         # Повторно инициировать неизвестные ошибки }

Если функция является частью модуля, можно использовать модуль Carp и вызвать croak или confess вместо die. Единственное отличие die от croak заклю­чается в том, что croak представляет ошибку с позиции вызывающей стороны, а не модуля. Функция confess по содержимому стека определяет, кто кого вызвал и с какими аргументами.




Содержание  Назад  Вперед