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


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

кроме того, что вообще делает 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   51   2011-10-01 06:52:48

2 ответа:

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

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

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

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

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

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

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

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