当“无法通过包y找到对象方法x”时打印堆栈跟踪(Perl)

Joh*_*nst 2 debugging perl

我可能会在错误类型的对象上调用方法x,但是它在我的调用堆栈中下降了,因此并不明显。

因此:有一种方法可以在发生此错误时始终打印完整的堆栈跟踪记录吗?

zdi*_*dim 5

要始终打印完整的堆栈跟踪use Carp::Always;,请使用

perl -MCarp::Always script
Run Code Online (Sandbox Code Playgroud)

或者,用bash

PERL5OPT=-MCarp::Always script
Run Code Online (Sandbox Code Playgroud)

设置PERL5OPT环境变量并运行(可执行文件)的内容script。例如,这允许使用中的shebang(#!)行script来确定使用哪个解释器。如果您使用export它(例如在shell配置文件中)export PERL5OPT=-MCarp::Always,那么它将被该shell中的所有Perl脚本使用。感谢池上的评论。

要微调哪些特定异常会引起更多关注,请添加$SIG{__DIE__}挂钩

use Carp;

BEGIN { 
    $SIG{__DIE__} = sub { 
        confess @_ if $_[0] =~ /Can't locate object method/;  #'
    };  
};
Run Code Online (Sandbox Code Playgroud)

并且在钩子返回“ ...之后,异常处理将像没有钩子时一样继续进行,除非... ”,请参见perlvar中的%SIG。上面die的代码通常会出现其他错误。

因此,在这里您可以更改die代码抛出时发生的情况,并在代码运行之前立即运行。例如,有关如何获取调用堆栈中每一帧的所有词法的信息,请参见这篇文章

搞混可能会变得棘手,因此请仔细阅读。例如,请参阅此文章中的链接。