Каков наилучший способ обработки исключений в Perl? - PullRequest
25 голосов
/ 24 октября 2010

Я заметил, что Exception.pm и Error.pm не используются в сообществе Perl.Это из-за большого размера eval для обработки исключений?

Кроме того, Perl-программы, похоже, имеют гораздо более мягкую политику в отношении обработки исключений в целом.Есть ли веская причина для этого?

В любом случае, что будет лучшим способом обработки исключений в Perl?

Ответы [ 2 ]

49 голосов
/ 24 октября 2010

Похоже, что сообщество Perl считает, что Try :: Tiny является предпочтительным способом обработки исключений. «Мягкая политика», на которую вы ссылаетесь, вероятно, вызвана комбинацией:

  • Perl не является полностью объектно-ориентированным языком. (например, в отличие от Java, где Вы не можете не иметь дело с исключениями.)
  • Фон многих разработчиков Perl. (Языки вроде C 1 и оболочки не имеют механизмы исключения.)
  • Вид задач, для которых люди склонны использовать Perl. (Небольшие скрипты для обработки текста и создание отчета, где обработка исключений не требуется.)
  • Perl не имеет (хорошего) встроенного механизма исключений.

Обратите внимание, что последний элемент означает, что вы увидите много кода, подобного этому:

eval { something() };
if ($@) {
    warn "Oh no! [$@]\n";
}

Это обработка исключений, даже если она не использует синтаксис try / catch. Тем не менее, он хрупок и сломается во многих тонких крайних случаях, о которых большинство людей не задумываются. Try :: Tiny и другие модули обработки исключений в CPAN были написаны, чтобы упростить процесс получения прав.

1. C имеет setjmp() и longjmp(), которые могут использоваться для очень грубой формы обработки исключений.

1 голос
/ 17 января 2019

Никогда не проверяйте $ @ как есть, потому что это глобальная переменная, поэтому даже сам тест может ее изменить.

Общий eval-шаблон:

my $result;

eval {
    $result= something();
    # ...
    1;  # ok
} or do {
    my $eval_error= $@ || "error";
    # ...
    die $eval_error;
};  # needs a semicolon

На практике это самый легкий путь. Это все еще оставляет крошечную комнату для забавного поведения $ @, но ничего такого, что действительно интересовало меня достаточно.

...