В чем разница между вариантами "Карп / Крук", "Клак" / "Исповедь" и подробным?

Я не так много использовал Карпа, потому что я обычно катал свой собственный. Однако, в духе соответствия с модулями 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 ответа

Решение

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

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

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

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

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

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

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

  • carp: не смертельно, без следа
  • cluck: не смертельно, с обратной трассировкой
  • croakфатальный, без следа
  • confessфатальный, с обратной трассировкой
Другие вопросы по тегам