为什么鲤鱼详细不起作用?

时间:2014-06-06 08:42:33

标签: perl exception stack-trace die

为什么use Carp qw(verbose);无法以我想要的方式运作?我的意思是只打印ERROR at ./test.pl line 8.我想要一个堆栈跟踪。请帮助制作die跟踪堆栈。

#!/usr/bin/perl

use strict;
use warnings;

use Carp qw(verbose);

sub c { die "ERROR"; }

sub b {
  c;
}

sub a {
  b;
}

a;

3 个答案:

答案 0 :(得分:3)

然后你想要confess

use strict;
use warnings;

use Carp qw(confess);

sub c { confess "ERROR"; }
sub b { c; }
sub a { b; }
a();

输出:

ERROR at confess.pl line 6.
        main::c() called at confess.pl line 7
        main::b() called at confess.pl line 8
        main::a() called at confess.pl line 9

如果您无法更改其他代码,则可以使用$SIG{__DIE__}

use Carp qw(confess);

$SIG{__DIE__} = \&confess;

sub c { die "ERROR"; }
sub b { c; }
sub a { b; }
a();

答案 1 :(得分:3)

尝试使用Devel::Confess。用法:

perl -d:Confess myscript.pl

使die打印堆栈轨道。

答案 2 :(得分:3)

use Carp qw( verbose );,文档说:

  

作为调试辅助工具,您可以强制Carp在所有模块中将croak视为confess,将carp视为cluck

您不使用croakcarp,因此use Carp qw( verbose );无用。

您可以通过覆盖die或创建$SIG{__DIE__}处理程序来实现您的目标。 Carp::Always是预先制定的解决方案,可以为您完成此任务。