我有可能在错误类型的对象上调用方法 x,但它在我的调用堆栈中很靠下,所以并不明显。
那么:有没有办法在发生此错误时始终打印完整的堆栈跟踪?
最佳答案
要始终打印完整的堆栈跟踪,请添加 use Carp::Always;
或使用以下命令运行程序
perl -MCarp::Always script
或者,使用 bash
PERL5OPT=-MCarp::Always script
什么设置了 PERL5OPT
environment variable并运行(可执行)脚本
。其一,这允许 script
中的 shebang (#!
) 行决定使用哪个解释器。如果您导出
它(比如在 shell 配置文件中),导出 PERL5OPT=-MCarp::Always
,那么它将被该 shell 中的所有 Perl 脚本使用。感谢ikegami征求意见。
要微调哪些特定异常需要更多关注,请添加 $SIG{__DIE__}
Hook
use Carp;
BEGIN {
$SIG{__DIE__} = sub {
confess @_ if $_[0] =~ /Can't locate object method/; #'
};
};
并且在钩子(Hook)返回“...异常处理继续,就像没有钩子(Hook)时一样,除非...”,请参阅 %SIG in perlvar 。上面的代码通常会因其他错误而死亡
。
因此,您可以在这里更改骰子
抛出时发生的情况,并在骰子抛出之前运行代码。例如,参见this post了解如何获取调用堆栈中每个帧的所有词汇。
搞乱这个可能会很棘手,所以请仔细阅读。请参阅 this post 中的链接,例如。
关于perl - 当 "Can' t 通过包 y 定位对象方法 x 时打印堆栈跟踪"(Perl),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45991133/