如何在Perl应用程序中用'confess'替换所有'die'?

时间:2009-12-09 23:19:05

标签: perl carp

我正在使用大型Perl应用程序,并且每次调用“die”时都希望获得堆栈跟踪。我知道Carp module,但我宁愿不用'confess'搜索/替换'die'的每个实例。另外,我想要Perl模块或Perl解释器本身的错误的完整堆栈跟踪,显然我无法改变那些使用Carp。

那么,有没有办法让我在运行时修改'die'函数,使其表现得像'confess'?或者,是否有一个Perl解释器设置会从'die'中抛出完整的堆栈跟踪?

4 个答案:

答案 0 :(得分:32)

使用Devel::SimpleTraceCarp::Always,无需您的任何努力,他们就会按照您的要求行事。它们具有全局效果,这意味着可以使用例如命令行在一次运行中轻松添加它们。 -MDevel::SimpleTrace

答案 1 :(得分:12)

如何设置__DIE__信号处理程序?像

这样的东西
$SIG{__DIE__} = sub { Carp::confess @_ };

在脚本的顶部?有关详细信息,请参阅perlvar %SIG

答案 2 :(得分:2)

我通常只想在一些代码中替换die,所以我将__DIE__处理程序本地化:

 {
 use Carp;
 local $SIG{__DIE__} = \&Carp::confess;

 ....
 }

作为一种开发工具,这可以起作用,但是有些模块可以通过这种技巧来实现它们的功能。当您覆盖他们期望的处理程序时,这些功能可能会以奇怪的方式中断。这不是一个好习惯,但有时会发生。

答案 3 :(得分:0)

Error模块将所有die转换为Error::Simple个对象,其中包含完整的堆栈跟踪(构造函数解析“at file ... line ..”文本并创建堆栈跟踪)。您可以使用任意对象(通常是Error::Simple的子类)来处理$Error::ObjectifyCallback首选项的错误。

如果您经常抛出其他类型的异常来发出其他事件的信号,那么这一点尤其方便,因为您只需为Error::Simple(或者您正在使用的其他类中的错误)添加一个处理程序并让它转储它stacktrace或执行专门的日志记录,具体取决于错误的类型。