我可能会在错误类型的对象上调用方法x,但是它在我的调用堆栈中下降了,因此并不明显。
因此:有一种方法可以在发生此错误时始终打印完整的堆栈跟踪记录吗?
要始终打印完整的堆栈跟踪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代码抛出时发生的情况,并在代码运行之前立即运行。例如,有关如何获取调用堆栈中每一帧的所有词法的信息,请参见这篇文章。
搞混可能会变得棘手,因此请仔细阅读。例如,请参阅此文章中的链接。