У меня есть набор вопросов о том, как люди используют исключения в 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 злым.
Вы используете объекты исключения? Если так, который и почему? В противном случае, почему нет?
Если бы Вы не используете объекты исключения, что соблазнило бы Вас использовать их?
Если Вы действительно используете объекты исключения, что Вы ненавидите о них, и что могло быть лучше?
Воплощает исключения в УМЕРЕТЬ обработчике плохая идея?
Где я должен воплотить свои исключения? В моей оценке {} обертка? В sigdie обработчике?
Есть ли любые бумаги, статьи или другие ресурсы на исключениях в целом и в Perl, который Вы находите полезными или поучительными.
Перекрестно разосланный в Perlmonks.
Я не очень часто использую объекты исключения; в основном потому, что обычно хватает строки и требует меньше усилий. Это связано с тем, что обычно программа ничего не может сделать с исключением. Если бы он мог избежать исключения, он бы его не вызвал.
Если вы можете что-то сделать с исключениями, используйте объекты. Если вы просто собираетесь убить программу (или какое-то ее подмножество, скажем, веб-запрос), избавьтесь от усилий придумывать сложную иерархию объектов, которые не делают ничего, кроме как содержат сообщение.
Что касается номера 4; Никогда не следует использовать $ SIG {__ DIE __}
. Это не сочиняет; если один модуль ожидает, что sigdie будет работать одним способом, а загружен другой модуль, который заставляет его работать другим способом, эти модули больше не могут использоваться в одной программе. Так что не делай этого.
Если вы хотите использовать объекты, просто выполните очень скучную die Object-> new (...)
. Возможно, это не так увлекательно, как какое-то супер-удивительное волшебство, но оно всегда работает, и код делает именно то, что говорит.