60

我没有太多使用鲤鱼,因为我通常自己滚动。但是,本着与核心模块保持一致的精神,我现在正在使用它。然而,它似乎比警告/死亡好不了多少。

此外,咯咯/坦白/冗长甚至可以做什么?我已经运行了这个简短的脚本来了解输出的样子(因为 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 在日志信息方面似乎仍然非常基础,并且不支持 Web 输出。我想我会看看其他的,比如 CGI::Carp、Log::Output 和 Log::Log4Perl。

4

2 回答 2

153

您的示例的问题是您的所有潜艇都在同一个包中(默认包:)main。这不是Carp设计的用例。

Carp 旨在用于模块中。原因是当一个模块遇到问题时,通常是因为模块的调用者传递了错误的数据。因此,与其报告模块发现问题的行,不如报告调用模块的行(来自模块外部的代码)通常更有用。这就是 Carp 导出的函数的作用。

有 2 组是/否选项。该函数可以是致命的(like die)或非致命的(like warn)。它可以只报告调用函数的行,也可以报告完整的回溯。

         Fatal  Backtrace
carp       N        N
cluck      N        Y
croak      Y        N
confess    Y        Y

详细选项强制回溯。也就是说,它使carp行为像cluck,并且croak行为像confess。当您意识到需要更多调试信息但又不想更改要使用的代码时,可以使用它confess

于 2011-10-01T03:47:11.343 回答
26

Carpwarn / die更好,因为它会显示引发错误的函数的文件和行,而不是简单地显示引发错误的位置。这通常对库很有用。(例如,数据库库可能应该抛出错误,指出错误的数据库调用在哪里,而不是在其自身中指出一行。)

carp, cluck, croak, 并confess为您提供四种选项组合:

  • carp: 不致命,没有回溯
  • cluck: 不致命,有回溯
  • croak: 致命的,没有回溯
  • confess: 致命的,带有回溯
于 2011-10-01T03:18:21.493 回答