我没有那么多地使用过Carp,因为我一般都是自己动手。但是,本着与Core模块保持一致的精神,我现在正在使用它。然而,似乎它几乎不比警告/死亡好。
此外,咯咯/忏悔/冗长甚至做什么?我已经运行了这个简短的脚本来了解输出的样子(因为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:使用软件包名称更新了脚本,它确实有所作为。但是,就记录信息而言,Carp似乎仍然非常基础,并且它不支持Web输出。我想我会看看其他像CGI :: Carp,Log :: Output和Log :: Log4Perl。
答案 0 :(得分:136)
您的示例的问题是所有子组件都在同一个包中(默认包:main
)。这不是Carp设计的用例。
Carp旨在用于模块中。原因是当模块遇到问题时,通常是因为模块的调用者传递了错误的数据。因此,不是报告模块发现问题的行,而是报告调用模块的行(从模块外部的代码)通常更有用。这就是Carp输出的功能。
有2组是/否选项。该函数可能是致命的(如die
)或非致命的(如warn
)。它只能报告调用函数的行,或者它可以报告完整的回溯。
Fatal Backtrace
carp N N
cluck N Y
croak Y N
confess Y Y
详细选项强制回溯。也就是说,它使carp
表现得像cluck
,croak
表现得像confess
。当您意识到需要更多调试信息但不想更改代码以使用confess
时,可以使用它。
答案 1 :(得分:24)
Carp
优于warn
/ die
,因为它会显示调用函数抛出错误的文件和行,而不是简单地抛出错误的位置。这通常对图书馆有用。 (例如,数据库库应该抛出指示错误数据库调用位置的错误,而不是在其自身内指示一行。)
carp
,cluck
,croak
和confess
为您提供了四种选项组合:
carp
:不致命,没有回溯cluck
:不是致命的,有回溯croak
:致命,没有回溯confess
:致命,有回溯