在Perl中,有没有办法强制所有致命的错误显示像Carp :: confess产生的堆栈回溯?
我知道你可以使用警告FATAL => ‘所有’;对目前的词汇范围发出致命的警告。
此外,可以使用$ SIG {__ WARN__} = sub {CORE :: die(@_)};使所有警告都到处死亡(尚未本地化SIGWARN处理程序)。
有没有干净的方法来做到这一点,还是需要调整SIGDIE?如果我写了一个SIGDIE处理程序,什么是获取跟踪的最佳方式?
一个理想的解决方案可以与标准测试库Test :: More和朋友一起工作。
更新:Mark Johnson建议使用SIGDIE处理程序来调用Carp :: confess。它的效果很好这里是代码:
use Carp; $SIG{ __DIE__ } = sub { Carp::confess( @_ ) };
解决方法
安装一个调用Carp :: confess的SIGDIE处理程序?或者只是设置Carp :: confess作为DIE的处理程序?
小心standard gotchas与eval有关。关于BEGIN块,甚至有weirder gotcha。另请注意ominous warning in perlvar。
有关生成堆栈跟踪的更多信息,请参见this question。