我为什么要在Perl中使用Carp而不是警告?

Fre*_*idt 26 perl module carp

人们不断向我提供鲤鱼的例子,而不是警告.为什么?是什么让鲤鱼比警告更好?

der*_*rby 41

carp为您提供有关消息来源的更多信息(上下文)

#!/usr/bin/perl

use Carp;

foo();
bar();
baz();

sub foo {
  warn "foo";
}

sub bar {
  carp "bar";
}

sub baz {
  foo();
  bar(); 
}
Run Code Online (Sandbox Code Playgroud)

产生

foo at ./foo.pl line 9.
bar at ./foo.pl line 13
        main::bar() called at ./foo.pl line 6
foo at ./foo.pl line 10.
bar at ./foo.pl line 14
        main::bar() called at ./foo.pl line 19
        main::baz() called at ./foo.pl line 7
Run Code Online (Sandbox Code Playgroud)

对于这个小程序来说有点傻,但是当你想知道谁叫做鲤鱼的方法时会派上用场.


bri*_*foy 22

warn用于脚本和简单程序,以及Carp任何模块内部.该Carp子程序使用的文件名和行号您当前的子程序被称为所以它更容易找到谁是造成问题的原因(不只是那里的问题表现出来).

Damian建议Carp不要warnPerl最佳实践中使用"报告失败" ,而是将脚本区分为顶级代码构造,将模块区分为程序使用的组件.

我最近一直不关心这个,因为我一直在使用Log :: Log4perl来处理所有这些.


jva*_*sak 12

carp更适合在模块内进行调试.如果您只是编写一个简单的脚本,那么没有任何好处.来自鲤鱼的文件:

Carp例程在您自己的模块中很有用,因为它们的行为类似于die()或warn(),但是使用的消息更可能对模块的用户有用.在cluck,confess和longmess的情况下,上下文是调用堆栈中每个调用的摘要.对于较短的消息,您可以使用carp或croak来报告错误,因为它来自模块的调用位置.不能保证这是错误的地方,但这是一个很好的教育猜测.


Mic*_*man 8

Carp从来电者的角度报告错误.这是一个模块,你通常要警告不正确使用可能有用(如缺少参数),并找出错误的地方发生,而不是它在哪里检测.这对于可能在许多地方使用的实用程序功能尤其重要.

大多数作者warn在脚本和carp模块中使用.warn当我希望错误消息反映模块实现中的问题时(例如它应该支持但不支持的情况),我偶尔会在模块内部使用.cluck在可以提供完整堆栈回溯的情况下,可以说这样会更好. .