在Perl中,是否有一种方法可以强制所有致命错误以显示像Carp::confess
产生的堆栈回溯?
我知道您可以执行use warnings FATAL => 'all';
使警告在当前词汇范围内致命。
此外,可以使用$SIG{__WARN__} = sub { CORE::die(@_) };
使所有警告在所有地方都是致命的(尚未本地化SIGWARN处理程序)。
有没有一种干净的方法可以做到这一点,或者我需要调整SIGDIE吗?如果我确实编写了SIGDIE处理程序,那么获取跟踪的最佳方法是什么?
理想的解决方案将与标准测试库,Test::More
和 friend 一起使用。
更新:马克·约翰逊(Mark Johnson)建议使用SIGDIE处理程序调用Carp::confess
。效果很好。这是代码:
use Carp;
$SIG{ __DIE__ } = \&Carp::confess;
最佳答案
安装一个调用Carp::confess的SIGDIE处理程序?还是只是将Carp::confess设置为DIE的处理程序?
当心与eval相关的standard gotchas。关于BEGIN块甚至有weirder gotcha。另请注意ominous warning in perlvar。
有关生成堆栈跟踪的更多信息,请参见this question。