【问题标题】:How can I replace all 'die's with 'confess' in a Perl application?如何在 Perl 应用程序中用 'confess' 替换所有 'die'?
【发布时间】:2010-12-25 01:26:02
【问题描述】:

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

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

【问题讨论】:

    标签: perl carp


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      如何设置__DIE__ 信号处理程序?类似的东西

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

      在脚本的顶部?请参阅perlvar %SIG 了解更多信息。

      【讨论】:

      • 我链接的模块通过设置$SIG{__DIE__} 工作,所以是的,在紧要关头你可以自己做同样的事情。这些模块只是有一些额外的代码来产生更好的输出:)
      • 这是自制错误处理的解决方案。您可以做任何您需要的事情,例如将错误保存在文件中或通过电子邮件发布。
      【解决方案3】:

      我通常只想用一点代码替换dies,所以我本地化了__DIE__处理程序:

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 有时Error 会破坏别人的异常处理代码并导致一个小的调试噩梦:)
        • 是的,很遗憾确实如此。我最近也不得不放弃它,因为它喜欢导出与 Moose 不兼容的with。我现在主要得出结论,例外是邪恶的。 :)
        猜你喜欢
        • 2012-08-08
        • 1970-01-01
        • 2016-08-03
        • 2020-02-28
        • 2012-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多