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.
Ошибка :: Исключение устанавливает правильную строку для объектов Исключение :: Класс.