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