Вы используете класс исключений в своих программах Perl? Почему или почему нет?

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

Спасибо.

Фон на исключениях Perl

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

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

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

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

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

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

Из-за незначительного сбоя реализации, $SIG {УМИРАЮТ}, рычаг называют даже в оценке (). Не используйте это для перезаписи незаконченного исключения в $, или как причудливая замена для переопределяющего ЯДРА:: ГЛОБАЛЬНЫЙ:: умрите (). Это странное действие на расстоянии может быть зафиксировано в будущем выпуске так, чтобы $SIG {УМЕРЛИ}, только назван, если Ваша программа собирается выйти, как было исходное намерение. Любое другое использование удерживается от использования.

Таким образом, теперь интересно, является ли воплощение исключений в sigdie злым.

Вопросы

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

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

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

  4. Воплощает исключения в УМЕРЕТЬ обработчике плохая идея?

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

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

Перекрестно разосланный в Perlmonks.

14
задан 2 revs 13 March 2010 в 21:00
поделиться

1 ответ

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

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

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

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

7
ответ дан 1 December 2019 в 16:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: