由于某种原因,无法在Carp :: croak()中禁用堆栈跟踪

时间:2012-08-09 08:27:40

标签: perl

根据Carp模块文档,除非croak()的计算结果为true,否则$Carp::Verbose不应生成任何堆栈跟踪。但是对于某些原因,croak()在我的环境中总是表现得像confess(),即总是打印堆栈跟踪,即使它不应该...

这是一个测试脚本:

#!/usr/bin/perl

use Modern::Perl;
use Carp;

sub func
{
    say "Carp::Verbose = $Carp::Verbose";
    croak "There should be no stack trace after this message!";
}

sub main
{
    func();
}

main;

这是它在我的系统上产生的结果:

$ ./croak
Carp::Verbose = 0
There should be no stack trace after this message! at ./croak line 8
    main::func() called at ./croak line 13
    main::main() called at ./croak line 16

也许有人遇到过这个问题,或者对根本原因有什么线索?

以下是有关我的环境的一些信息:

Ubuntu 12.04 LTS
Linux 3.2.0-27-generic x86_64
perl 5, version 14, subversion 2 (v5.14.2) built for x86_64-linux-gnu-thread-multi

我的SL6系统也出现了同样的错误行为:

Scientific Linux SL release 6.3 (Carbon)
kernel-2.6.32-279.1.1.el6.x86_64
perl, v5.10.1 (*) built for x86_64-linux-thread-multi

2 个答案:

答案 0 :(得分:4)

用于错误消息的堆栈跟踪帧的Carp规则之一是:

  
      
  1. 从包裹到自身的任何电话都是安全的。
  2.   

由于您的代码不使用main以外的任何其他软件包,并且由于另一条规则是Carp软件包本身是安全的,Carp无法确定代码行用于它的错误消息,所以它打出并打印出整个堆栈跟踪。

哦,它实际上存在于Carp perldoc:

  

他们所做的是在调用堆栈中搜索函数调用堆栈,其中没有被告知不应该出现错误。 如果每个电话都标记为安全,则会放弃并提供完整的堆栈回溯。

Carp::short_error_loc功能中的这一行是你的吸烟枪:

return 0 unless defined($caller);    # What happened?

答案 1 :(得分:3)

半个答案:它与代码存在于同一个包中有关。如果您从其他包中调用入口点,croak将按预期工作。