Используете ли вы класс исключений в ваших программах Perl? Почему или почему нет? - PullRequest
14 голосов
/ 13 марта 2010

У меня есть куча вопросов о том, как люди используют исключения в Perl. Я включил некоторые справочные заметки об исключениях, пропустите это, если хотите, но, пожалуйста, найдите время, чтобы прочитать вопросы и ответить на них.

Спасибо.

Справочная информация об исключениях Perl

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

Например, die "I ate a bug.\n"; выдает исключение со строкой, присвоенной $@.

Вы также можете бросить объект вместо строки: die BadBug->new('I ate a bug.');

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

$SIG{__DIE__} = sub { 
    my $e = shift; 
    $e = ExceptionObject->new( $e ) unless blessed $e;
    die $e;
}

Этот шаблон используется в ряде модулей CPAN. но Перлвар говорит:

Из-за сбоя реализации Хук $ SIG { DIE } называется четным внутри eval (). Не используйте это для переписать ожидающее исключение в $ @, или как странная замена для переопределения CORE :: GLOBAL :: die (). Это странно действие на расстоянии может быть зафиксировано в будущий релиз, так что $ SIG { DIE } вызывается только если ваша программа о выходе, как было в оригинале намерение. Любое другое использование не рекомендуется.

Так что теперь я задаюсь вопросом, является ли объективация исключений в Сигди злом.

Вопросы

  1. Вы используете объекты исключений? Если да, то какой и почему? Если нет, то почему?

  2. Если вы не используете объекты исключений, что могло бы побудить вас использовать их?

  3. Если вы используете объекты исключений, что вы ненавидите в них и что может быть лучше?

  4. Является ли объективация исключений в обработчике DIE плохой идеей?

  5. Где я должен объективировать свои исключения? В моей eval {} оболочке? В обработчике sigdie?

  6. Существуют ли какие-либо статьи, статьи или другие ресурсы об исключениях в целом и в Perl, которые вы считаете полезными или полезными.

Кросс-пост в Perlmonks .

1 Ответ

7 голосов
/ 14 марта 2010

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

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

Что касается № 4; $SIG{__DIE__} никогда не должен использоваться. Это не сочиняет; если один модуль ожидает, что sigdie будет работать одним способом, а другой модуль загружен, что заставляет его работать другим способом, эти модули больше нельзя использовать в одной и той же программе. Так что не делай этого.

Если вы хотите использовать объекты, просто сделайте очень скучный die Object->new( ... ). Возможно, это не так увлекательно, как какое-то сверхъестественное волшебство, но оно всегда работает, и код делает именно то, что говорит.

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