В чем разница между вариантами «Карп / Крук», «Клак» / «Исповедь» и подробным? - PullRequest
52 голосов
/ 01 октября 2011

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

Кроме того, что вообще делает cluck / confess / verbose? Я запустил этот короткий сценарий, чтобы получить представление о том, как выглядит результат (потому что документы 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.

Ответы [ 2 ]

136 голосов
/ 01 октября 2011

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

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

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

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

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

24 голосов
/ 01 октября 2011

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

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

  • carp: не смертельно, без обратной трассировки
  • cluck: не смертельно, с обратной трассировкой
  • croak:смертельно, без следа
  • confess: смертельно, со следом
...