Подтвердить что ты не робот

Используете ли вы класс исключения в своих программах 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.

4b9b3361

Ответ 1

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

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

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

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