Используете ли вы класс исключения в своих программах Perl? Почему или почему нет?
У меня есть куча вопросов о том, как люди используют исключения в Perl. Я включил некоторые справочные примечания об исключениях, пропустите это, если хотите, но, пожалуйста, найдите минутку, чтобы прочитать вопросы и ответить на них.
Спасибо.
Фон для исключений Perl
Perl имеет очень базовую встроенную систему исключений, которая предоставляет spring -board для более сложного использования.
Например, die "I ate a bug.\n";
выдает исключение со строкой, назначенной [email protected]
.
Вы также можете выбросить объект вместо строки: die BadBug->new('I ate a bug.');
Вы даже можете установить обработчик сигнала, чтобы поймать suedo-сигнал SIGDIE. Здесь обработчик, который пересказывает исключения как объекты, если они еще не были.
$SIG{__DIE__} = sub {
my $e = shift;
$e = ExceptionObject->new( $e ) unless blessed $e;
die $e;
}
Этот шаблон используется в ряде модулей CPAN. но perlvar говорит:
Из-за сбоя реализации, $SIG { DIE} крючок называется четным внутри eval(). Не используйте это для переписать ожидающее исключение в [email protected]или как странная замена для переопределения CORE:: GLOBAL:: die(). Это странное действие на расстоянии может быть зафиксировано в будущий выпуск, чтобы $SIG { DIE} вызывается только в том случае, если ваша программа около выхода, как и оригинал намерение. Любое другое использование устарело.
Итак, теперь я задаюсь вопросом, является ли объектизация исключений в сигди злом.
Вопросы
-
Используете ли вы объекты исключений? Если да, то какой и почему? Если нет, почему бы и нет?
-
Если вы не используете объекты исключений, что побуждает вас их использовать?
-
Если вы используете объекты исключений, что вы ненавидите о них и что может быть лучше?
-
Является ли объектизация исключений в обработчике DIE плохими идеями?
-
Где я должен объективировать свои исключения? В моей обертке eval {}? В обработчике sigdie?
-
Есть ли какие-либо документы, статьи или другие ресурсы об исключениях вообще и в Perl, которые вы найдете полезными или просвещенными.
Перекрестная ссылка на Perlmonks.
Ответы
Ответ 1
Я не очень часто использую объекты исключения; в основном потому, что строка обычно достаточно и требует меньше работы. Это связано с тем, что, как правило, ничего не может сделать программа для исключения. Если бы он мог избежать исключения, это не вызвало бы его в первую очередь.
Если вы можете что-то сделать об исключениях, используйте объекты. Если вы просто собираетесь убить программу (или некоторое подмножество, скажем, веб-запрос), сэкономить усилия на разработку сложной иерархии объектов, которые не более чем содержат сообщение.
Что касается числа 4; $SIG{__DIE__}
никогда не следует использовать. Он не сочиняет; если один модуль ожидает, что sigdie будет работать в одном направлении, а другой модуль будет загружен, что заставляет его работать каким-то другим способом, эти модули больше не могут использоваться в одной и той же программе. Так что не делайте этого.
Если вы хотите использовать объекты, просто сделайте очень скучный die Object->new( ... )
. Возможно, это не так интересно, как какая-то супер-удивительная магия, но она всегда работает, и код делает именно то, что она говорит.