Carp/Croak,Cluck/Confess和详细选项之间有什么区别?

Bre*_*yrd 52 error-handling perl 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();
Run Code Online (Sandbox Code Playgroud)

更新:使用包名更新了脚本,它确实有所作为.但是,就记录信息而言,Carp似乎仍然非常基础,并且它不支持Web输出.我想我会看看其他像CGI :: Carp,Log :: Output和Log :: Log4Perl.

cjm*_*cjm 140

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

鲤鱼旨在用于模块.原因是当模块遇到问题时,通常是因为模块的调用者传递了错误的数据.因此,不是报告模块发现问题的行,而是报告调用模块的行(从模块外部的代码)通常更有用.这就是Carp输出的功能.

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

         Fatal  Backtrace
carp       N        N
cluck      N        Y
croak      Y        N
confess    Y        Y
Run Code Online (Sandbox Code Playgroud)

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

  • 优秀的总结 (2认同)

dus*_*uff 24

Carp优于warn/ die因为它将显示调用函数抛出错误的文件和行,而不是简单地抛出错误的位置.这通常对图书馆有用.(例如,数据库库可能会抛出指示错误数据库调用位置的错误,而不是在其自身内指示一行.)

carp,cluck,croak,和confess给你的选择四种组合:

  • carp:不致命,没有回溯
  • cluck:不是致命的,有回溯
  • croak:致命,没有回溯
  • confess:致命,有回溯