微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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.jb51.cc/Perl/171526.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐