Как мне проверить тип исключения в Perl? - PullRequest
8 голосов
/ 01 марта 2010

Как я могу проверить, какое исключение вызвало завершение скрипта или блока eval? Мне нужно знать тип ошибки и место возникновения исключения.

1 Ответ

13 голосов
/ 01 марта 2010

Perl way

Идиоматический Perl заключается в том, что мы либо игнорируем все ошибки, либо фиксируем их для регистрации или пересылки в другое место:

eval { func() };  # ignore error

или

* +1007 *

или (используя Try :: Tiny - посмотрите на этой странице причины, по которым вам может потребоваться использовать ее вместо встроенной в Perl обработки исключений):

try { func() }
catch {
     carp "Inner function failed: $_";
     do_something_with($_);
};

Если вы хотите проверить тип исключения, используйте регулярные выражения:

if ( $@ =~ /open file "(.*?)" for reading:/ ) {
    # ...
}

Строка и файл также находятся в этой строке.

Это довольно неприятно, потому что вы должны знать точную строку. Если вы действительно хотите хорошую обработку ошибок, используйте модуль исключения из CPAN .

Исключение :: Class

$ @ не обязательно должно быть строкой, это может быть объект. Exception :: Class позволяет объявлять и генерировать объекты исключений в стиле Java. Вы можете передать произвольную информацию (имя файла и т. Д.) С ошибкой, когда вы ее выбросите и получите эту информацию, используя методы объекта, а не анализ регулярных выражений, включая file и номер строки исключение.

Если вы используете сторонний модуль, который не использует Error :: Exception, рассмотрите

$SIG{__DIE__} = sub { Exception::Class::Base->throw( error => join '', @_ ); };

Это преобразует все ошибки в объекты Exception :: Class.

Ошибка :: Исключение устанавливает правильную строку для объектов Исключение :: Класс.

...