18

我正在一个大型 Perl 应用程序中工作,并且希望每次调用 'die' 时都获得堆栈跟踪。我知道Carp 模块,但我不希望用 'confess' 搜索/替换 'die' 的每个实例。此外,我想要 Perl 模块或 Perl 解释器本身中的错误的完整堆栈跟踪,显然我不能将它们更改为使用 Carp。

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

4

4 回答 4

32

使用Devel::SimpleTraceCarp::Always,他们会按照您的要求去做,而无需您付出任何努力。它们具有全局效果,这意味着它们可以很容易地添加到命令行上运行一次,例如-MDevel::SimpleTrace.

于 2009-12-09T23:24:11.093 回答
13

设置__DIE__信号处理程序怎么样?就像是

$SIG{__DIE__} = sub { Carp::confess @_ };

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

于 2009-12-09T23:24:21.047 回答
3

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

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

 ....
 }

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

于 2009-12-10T18:00:42.383 回答
0

Error模块会将所有dies转换为Error::Simple包含完整堆栈跟踪的对象(构造函数解析“at file... line..”文本并创建堆栈跟踪)。您可以使用任意对象(通常从 子类Error::Simple化)来处理带有$Error::ObjectifyCallback偏好的错误。

如果您通常抛出其他类型的异常以发出其他事件的信号,这将特别方便,因为您只需为Error::Simple(或您用于错误的任何其他类)添加一个处理程序并让它转储其堆栈跟踪或执行专门的日志记录,具体取决于错误类型。

于 2009-12-09T23:55:31.657 回答