Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

my $result;

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

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