Perl目前$SIG{__DIE__}以这样的方式实现,它将捕获发生的任何错误,即使在eval块内也是如此.这有一个非常有用的属性,您可以在发生错误的确切位置暂停代码,收集实际错误的堆栈跟踪,将其包装在对象中,然后使用此对象作为参数手动调用die.
这种滥用已$SIG{__DIE__}被弃用.据官方统计,你应该更换$SIG{__DIE__}使用*CORE::GLOBAL::die.但是,这两者并不等同.*CORE::GLOBAL::die是不是当发生运行时错误叫!它只是替换显式调用die().
我对更换模具不感兴趣.
我特别感兴趣的是捕获运行时错误.
我需要确保在任何模块中任何深度的任何函数中的任何运行时错误都会导致Perl将控制传递给我,以便我可以收集堆栈跟踪并重新抛出.这需要在eval块内部工作 - 一个或多个封闭的eval块可能想要捕获异常,但运行时错误可能是在任何模块内部没有封闭eval的函数中.
$SIG{__DIE__} 完美支持这一点 - 并忠实地为我服务了几年或更长时间 - 但Be™警告说,这个梦幻般的设施可能会随时被抢走,我不希望有一天会有令人讨厌的惊喜.
理想情况下,对于Perl本身,它们可以$SIG{__RTMERR__}为此目的创建一个新信号(无论如何,切换信号很容易,因为它只挂在一个地方).不幸的是,我的说服力不会导致酗酒者破解瓶子,所以假设不会发生这种情况,那么人们究竟应该如何才能实现干净地捕捉运行时错误的目标呢?
(例如,这里的另一个答案是推荐Carp :: Always,它也挂钩了DIE!)