В чем разница между вариантами «Карп / Квакан», «Ключ / Признание» и «Подробным»?

Я не так часто использовал Карпа, потому что обычно катался самостоятельно. Однако, следуя принципам основных модулей, я использую его сейчас. Однако, похоже, это едва ли лучше, чем предупредить / умереть.

Кроме того, что вообще делает кудахтанье / исповедь / многословие? Я запустил этот короткий сценарий, чтобы получить представление о том, как выглядит результат (потому что документация Carp этого не делает). Он выглядит одинаково при любом запуске (кроме случайных строк).

  #!/usr/bin/perl

  package Warning;

  sub warning {
    warn "warn";
  }

  package CWarn;
  use Carp qw(carp cluck);

  sub cwarn {
    int(rand(2)) ? carp "carp" : cluck "cluck";
  }

  package Fatal;
  use Carp qw(confess croak);

  sub fatal {
    int(rand(2)) ? confess "confess" : croak "croak";
  }

  package Loop;

  use v5.10;

  sub loop {
    say '=' x 80;
    Warning::warning();
    CWarn::cwarn();
    loop() unless ($c++ > 10);
    Fatal::fatal();
  }

  package main;

  Warning::warning();
  CWarn::cwarn();
  Loop::loop();

ОБНОВЛЕНИЕ: скрипт обновлен с именами пакетов, и это действительно имеет значение. Тем не менее, Carp по-прежнему кажется очень простым с точки зрения регистрации информации и не поддерживает вывод в Интернет. Думаю, я посмотрю на другие, такие как CGI :: Carp, Log :: Output и Log :: Log4Perl.


person SineSwiper    schedule 01.10.2011    source источник
comment
Вы пробовали читать документацию? Это лучше, чем метод проб и ошибок.   -  person brian d foy    schedule 01.10.2011
comment
Я не разворачиваю свои собственные модули, но использую объектно-ориентированное программирование, что означает, что я использую пакеты. Даже если вся ваша программа находится в одном файле, но вы определяете классы через package, вам пригодятся carp и croak. как указано cmj.   -  person David W.    schedule 08.04.2013
comment
@briandfoy Вот документация: The Carp routines are useful in your own modules because they act like die() or warn(), but with a message which is more likely to be useful to a user of your module. Не очень полезно, если вы лично не используете пакеты и не видите разницу.   -  person David W.    schedule 08.04.2013
comment
@briandfoy Я собираюсь сказать, что документы Carp не могут четко указать, является ли кудахтанье фатальным или нет, по крайней мере, в первых нескольких абзацах. Всего лишь один опыт новичков.   -  person Leonard    schedule 27.11.2013
comment
Спросить, что делают функции - справедливый вопрос, документация в этом случае очень скудная. Я читал его десятки раз и все еще не могу найти нужную информацию. Похоже, что его не улучшали более 7 лет.   -  person Will Sheppard    schedule 28.06.2019


Ответы (2)


Проблема с вашим примером заключается в том, что все ваши подпрограммы находятся в одном пакете (пакет по умолчанию: main). Это не тот вариант использования, для которого был разработан Carp.

Карп предназначен для использования в модулях. Причина в том, что когда модуль сталкивается с проблемой, это часто связано с тем, что вызывающий модуль передал ему неверные данные. Поэтому вместо сообщения строки, в которой модуль обнаружил проблему, обычно более полезно сообщить строку, в которой был вызван модуль (из кода вне модуля). Вот что делают функции, экспортируемые Carp.

Есть 2 набора вариантов «да / нет». Функция может быть фатальной (например, die) или нефатальной (например, _ 3_). Он может сообщать только строку, в которой была вызвана функция, или может сообщать полную обратную трассировку.

         Fatal  Backtrace
carp       N        N
cluck      N        Y
croak      Y        N
confess    Y        Y

Параметр «Подробный» принудительно включает трассировку. То есть он заставляет carp действовать как cluck, а croak действовать как confess. Вы можете использовать это, когда поймете, что вам нужно больше отладочной информации, но вы не хотите изменять код для использования confess.

person cjm    schedule 01.10.2011

Карп лучше, чем предупреждать / умереть в что он будет отображать файл и строку того, что называется функцией, вызывающей ошибку, а не просто то, где возникла ошибка. Это часто может быть полезно для библиотек. (Например, библиотека базы данных, вероятно, должна выдавать ошибки, указывающие, где находится ошибочный вызов базы данных, а не указание строки внутри себя.)

carp, cluck, croak и confess дают вам четыре комбинации вариантов:

  • carp: не фатально, без обратного следа
  • cluck: не фатально, со следом
  • croak: фатальный, без следа
  • confess: фатальный, со следом
person Community    schedule 01.10.2011