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

标签 perl error-handling carp

我没有经常使用 Carp,因为我通常都是自己开发的。然而,本着与核心模块保持一致的精神,我现在正在使用它。然而,它似乎只比 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();

更新:使用包名称更新了脚本,它确实有所不同。然而,Carp 在日志信息方面似乎仍然非常基础,并且不支持 Web 输出。我想我会看看其他的,比如 CGI::Carp、Log::Output 和 Log::Log4Perl。

最佳答案

您的示例的问题是您的所有子程序都位于同一个包中(默认包:main)。这不是 Carp 的用例。专为。

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

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

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

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

关于perl - Carp/Croak、Cluck/Confess 和详细选项之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7617852/

相关文章:

perl - 比较 perl 中的两个(可能) undef 变量

perl - Perl 有 andand 吗?

r - 匹配并计算 R 中的数据矩阵

c# - 发生错误时从Entity Framework中删除一批记录

python - Python 中的 CARP 哈希

perl - 为什么不在 Perl 中使用严格和警告?

php - 通过composer命令在Laravel安装程序中出错

go - 单个 defer func() 可以被其他函数共享吗?

perl - 从 Moose BUILD 方法中发出嘶嘶声

c - 是否有与 Perl 的 Carp 模块等效的 C 语言?