加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

捕获Perl中的运行时错误并转换为异常

发布时间:2020-12-15 22:01:56 所属栏目:大数据 来源:网络整理
导读:Perl目前实现$SIG {__ DIE__},即使在eval块内也可以捕获发生的任何错误.这有一个非常有用的属性,您可以在发生错误的确切点停止代码,收集实际错误的堆栈跟踪,将其包装在对象中,然后以此对象作为参数手动调用. 滥用$SIG {__ DIE__}已被弃用.正式地,你应该用* C
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上的工作,所以下一个开发人员不需要再次重新发明.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读