Perl目前实现$SIG {__ DIE__},即使在eval块内也可以捕获发生的任何错误.这有一个非常有用的属性,您可以在发生错误的确切点停止代码,收集实际错误的堆栈跟踪,将其包装在对象中,然后以此对象作为参数手动调用.
滥用$SIG {__ DIE__}已被弃用.正式地,你应该用* CORE :: GLOBAL :: die替换$SIG {__ DIE__}.但是,这两个不是等价的. * CORE :: GLOBAL ::当运行时错误发生时,不会调用die它所做的只是替换对die()的显式调用.
我不想替换死.
我特别关心捕捉运行时错误.
我需要确保在任何模块中任何深度的任何运行时错误导致Perl将控件传递给我,以便我可以收集堆栈跟踪并重新抛出.这需要在eval块内部工作 – 一个或多个封闭的eval块可能想要捕获异常,但运行时错误可能在任何模块中都没有包含eval的函数.
$SIG {__ DIE__}完全支持这一点,并且忠实地服务了几年或更久 – 但是Be™警告说,这个奇妙的设施可能随时被抢走,我不想要一个令人讨厌的惊喜有一天下线.
理想情况下,对于Perl本身,他们可以为此创建一个新的信号$SIG {__ RTMERR__}(切换信号很简单,对我来说,因为它只在一个地方挂钩).不幸的是,我的说服力不会导致酒精破裂瓶子,所以假设不会发生这种情况,应该如何实现这样一个目标呢,干净地捕捉运行时错误?
(例如,另一个答案在这里推荐Carp :: Always,哪个也挂钩DIE!)
解决方法
去做就对了.我做完了大概知道这个钩子的人都可以做到这一点.
这是Perl它仍然相容几十年.我在这里解释“不赞成”,意思是“如果你不需要它,那么请不要使用这个.但是你确实需要它,并且似乎明白了这个含义,所以我要去做.我非常怀疑一个不可替代的语言功能即将消失.
并释放您在CPAN上的工作,所以下一个开发人员不需要再次重新发明. 原文链接:https://www.f2er.com/Perl/171526.html