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

时间:2008-10-09 19:10:49

标签: perl module carp

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

4 个答案:

答案 0 :(得分:41)

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

#!/usr/bin/perl

use Carp;

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

sub foo {
  warn "foo";
}

sub bar {
  carp "bar";
}

sub baz {
  foo();
  bar(); 
}

产生

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
对于这个小程序来说有点傻,但是当你想知道谁叫这个鲤鱼的方法时会派上用场。

答案 1 :(得分:22)

我将warn用于脚本和简单程序,并在任何模块中使用CarpCarp子例程使用调用当前子例程的文件名和行号,这样就可以更容易地找到导致问题的原因(而不仅仅是问题出现在哪里)。

Damian在 Perl最佳实践中的“报告失败”中建议使用Carp而不是warn,但不会将脚本区分为顶级代码构造和模块作为程序使用的组件。

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

答案 2 :(得分:12)

carp更适合在模块内进行调试。如果您只是编写一个简单的脚本,那么没有任何好处。来自the Carp documenation

  

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

答案 3 :(得分:8)

Carp从来电者的角度报告错误。这对于您通常想要警告错误使用(例如缺少参数)的模块非常有用,并确定错误发生的位置而不是检测到的位置。这对于可能在许多地方使用的实用程序功能尤为重要。

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