"Can't locate object method x via package y"时打印堆栈跟踪 (Perl)



我很可能在错误类型的对象上调用方法x,但它在我的调用堆栈中很低,所以不明显。

那么:当出现此错误时,有没有一种方法可以始终打印完整的堆栈跟踪?

要始终打印完整堆栈跟踪,请添加use Carp::Always;或使用运行程序

perl -MCarp::Always script

或者,使用bash

PERL5OPT=-MCarp::Always script

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

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

use Carp;
BEGIN { 
$SIG{__DIE__} = sub { 
confess @_ if $_[0] =~ /Can't locate object method/;  #'
};  
};

在钩子返回">…异常处理将继续,就像没有钩子时一样,除非…",请参阅perlvar中的%SIG。die以上的代码通常存在其他错误。

因此,在这里,您可以更改抛出die时发生的情况,代码在它运行之前立即运行。例如,请参阅本文,了解如何获取调用堆栈中每个帧的所有词汇。

搞砸这个可能会很棘手,所以请仔细阅读。例如,请参阅本文中的链接。

Perl附带的Carp模块可用于生成堆栈跟踪。

Carp提供了warndie的替换,它们可以用于简单地将有问题的文件和行号1级别备份到调用堆栈,也可以用于生成堆栈跟踪。

在您的情况下,听起来您实际上并没有调用die——这是由于试图调用一个不存在的方法而导致的。在这种情况下,您可以使用Carp的"verbose"模式强制全局跟踪堆栈。有许多方法可以启用详细模式。它可以通过环境、用于调用Perl的命令行或脚本内部完成:

use Carp 'verbose';

最新更新