鲤鱼/呱呱叫、咯咯/忏悔和冗长选项有什么区别?



我没有那么多地使用鲤鱼,因为我通常是自己卷的。然而,本着与Core模块保持一致的精神,我现在正在使用它。然而,它似乎只比warn/die好一点点。

此外,cluck/confess/verbose到底能做什么?我运行这个短脚本是为了了解输出的样子(因为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。

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

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

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

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

verbose选项强制开启回溯。也就是说,它使carpcluck一样,croakconfess一样。当您意识到需要更多调试信息,但又不想更改代码以使用confess时,可以使用它。

Carp比warn/die更好,因为它将显示抛出错误的函数所在的文件和行,而不是简单地显示抛出错误的位置。这通常对库很有用。(例如,数据库库可能会抛出错误,指示错误的数据库调用在哪里,而不是指示其内部的一行。)

carp, cluck, croakconfess提供了四种选项组合:

  • carp: not fatal, no backtrace
  • cluck: not fatal, with backtrace
  • croak: fatal, no backtrace
  • confess: fatal, with backtrace

相关内容

  • 没有找到相关文章

最新更新