Я не использовал Carp так много, потому что я вообще катился самостоятельно. Однако, в духе соблюдения модулей Core, я использую его сейчас. Однако кажется, что это едва лучше, чем предупреждать/умирать.
Кроме того, что делает cluck/confess/verbose даже делать? Я запустил этот короткий script, чтобы понять, как выглядит вывод (потому что документы 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();
UPDATE: Обновлен script с именами пакетов, и это имеет значение. Тем не менее, Carp по-прежнему кажется очень простым с точки зрения информации о регистрации, и он не поддерживает веб-выход. Думаю, я посмотрю на другие, такие как CGI:: Carp, Log:: Output и Log:: Log4Perl.
Проблема с вашим примером заключается в том, что все ваши подсайты находятся в одном пакете (пакет по умолчанию: main
). Это не тот вариант использования Carp.
Карп предназначен для использования в модулях. Причина в том, что когда модуль сталкивается с проблемой, это часто происходит потому, что вызывающий модуль передал ему плохие данные. Поэтому вместо того, чтобы сообщать о линии, в которой модуль обнаружил проблему, обычно более полезно сообщать о строке, в которой был вызван модуль (из кода вне модуля). Это то, что делают функции, экспортируемые Carp.
Есть два набора параметров да/нет. Функция может быть фатальной (например, die
) или нефатальной (например, warn
). Он может сообщать только о строке, в которой была вызвана функция, или может сообщать полную обратную трассировку.
Fatal Backtrace
carp N N
cluck N Y
croak Y N
confess Y Y
Опция verbose принудительно возвращает backtraces. То есть, carp
действует как cluck
, а croak
действует как confess
. Вы можете использовать это, когда понимаете, что вам нужна дополнительная информация для отладки, но не хотите менять код для использования confess
.
Carp
лучше, чем warn
/die
, поскольку он отображает файл и строку того, что называется функцией, бросающей ошибку, а не просто там, где была вызвана ошибка. Это часто может быть полезно для библиотек. (Например, библиотека базы данных должна, вероятно, передавать ошибки, указывающие, где ошибочный вызов базы данных, а не указывать строку внутри себя.)
Carp
, cluck
, croak
и confess
предоставляют четыре комбинации параметров:
Carp
: не фатальный, нет backtracecluck
: не смертельно, с backtracecroak
: фатальный, без backtraceconfess
: фатальный, с backtrace
package
, вы найдете удобныйcarp
иcroak
. как указано CMJ .