首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Carp/Croak、Cluck/Confess和verbose选项有什么不同?

Carp/Croak、Cluck/Confess和verbose选项有什么不同?
EN

Stack Overflow用户
提问于 2011-10-01 10:52:48
回答 2查看 29.7K关注 0票数 60

我并没有经常使用Carp,因为我通常会使用自己的。然而,本着与核心模块保持一致的精神,我现在正在使用它。然而,它似乎比warn/die好不了多少。

此外,cluck/confess/verbose到底做了什么?我已经运行了这个简短的脚本,以了解输出是什么样子的(因为Carp文档不这样做)。它在任何运行中看起来都是完全相同的(除了随机字符串)。

代码语言:javascript
复制
  #!/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。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-01 11:47:11

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

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

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

代码语言:javascript
复制
         Fatal  Backtrace
carp       N        N
cluck      N        Y
croak      Y        N
confess    Y        Y

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

票数 152
EN

Stack Overflow用户

发布于 2011-10-01 11:18:21

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

carpcluckcroakconfess提供了四种选项组合:

  • carp:not fatal、no backtrace
  • cluck:not fatal、with backtrace
  • croak:fatal、no backtrace
  • confess:fatal、with backtrace
票数 26
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7617852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档