Каковы лучшие практики для обработки ошибок в Perl? - PullRequest
14 голосов
/ 20 мая 2010

Я изучаю Perl, и во многих примерах я вижу, что ошибки обрабатываются следующим образом

open FILE, "file.txt" or die $!;

Действительно ли die в середине скрипта - лучший способ справиться с ошибкой?

Ответы [ 5 ]

21 голосов
/ 20 мая 2010

Подходит ли die в середине сценария, зависит от того, что вы делаете. Если это только десятки строк, то это нормально. Небольшой инструмент с парой сотен строк, затем рассмотрите признание (см. Ниже). Если это большая объектно-ориентированная система с множеством классов и взаимосвязанным кодом, то, возможно, лучше использовать объект исключения.

Признайтесь в пакете Карп :
Часто ошибка, которая привела к смерти, не находится на линии, которая сообщает отчеты. Замена die на confess (см. Пакет Carp) даст трассировку стека (как мы дошли до этой строки), что очень поможет в отладке.

Для обработки исключений из встроенных в Perl я люблю использовать autodie . Он перехватывает сбои при open и других системных вызовах и генерирует исключения для вас, без необходимости делать бит or die. Эти исключения можно поймать с помощью eval { }, или, что еще лучше, с помощью Try :: Tiny .

13 голосов
/ 20 мая 2010

Поскольку я использую Log :: Log4perl почти везде, я использую $logger->logdie вместо die. И если вы хотите больше контролировать свои исключения, рассмотрите Exception :: Class .

Лучше ловить ваши исключения с помощью Try :: Tiny (см. Документацию почему).

7 голосов
/ 20 мая 2010

Если у вас нет более конкретной идеи, тогда да вы хотите умереть, когда происходят неожиданные вещи.

  • Умереть при невозможности открыть файл и дать имя файла лучше, чем система, сообщающая вам, что он не может читать или писать анонимному неопределенному.

  • Если вы говорите о «скрипте», в общем, вы говорите о довольно простом фрагменте кода. Не слои, которые нуждаются в координации (обычно не). В Perl Module есть сопутствующая идея, что вы не владеете средой исполнения, поэтому либо основное программное обеспечение заботится об этом, и оно ловит вещи в eval, либо оно действительно не заботится и не умирает было бы хорошо. Тем не менее, вы должны попробовать немного больше надежности в качестве модуля и просто вернуть undefs или что-то в этом роде.

  • Вы можете поймать все, что умирает (или каркает) в блоке eval. И вы можете сделать свою более конкретную обработку там.

  • Но если вы хотите проверить $! затем напишите этот код , и у вас будет более конкретное разрешение.

  • Взгляните на почти универсальный стандарт использования strict. Это код, который умирает от сомнительного синтаксиса, вместо того, чтобы позволить вам продолжать.

Так что я думаю, что общая идея такова: да, DIE , если у вас нет лучшего представления о том, как следует обращаться с вещами. Если вы вложите в него достаточно предвидения, вы можете получить прощение за один или два раза, когда не умрете, потому что вы знаете вам не нужно.

3 голосов
/ 20 мая 2010

Более современный подход заключается в использовании стандартной библиотеки Carp.

use Carp;
my $fh;
open $fh, '<', "file.txt" or confess($!);

Главное преимущество в том, что он дает трассировку стека при смерти.

0 голосов
/ 20 мая 2010

Я использую die, но оборачиваю ее в блоки eval для контроля над обработкой ошибок:

my $status = eval
{
    # Some code...
};

Если 'eval' терпит неудачу:

  1. $status будет неопределенным.
  2. $@ будет установлено на любое сообщение об ошибке (или содержимое die)

Если 'eval' завершается успешно:

  1. $status будет последним возвращенным значением блока.
  2. $@ будет установлен в ''.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...