perl - 在 Perl 中捕获运行时错误并转换为异常

标签 perl runtime-error

Perl 当前实现 $SIG{__DIE__}即使在 eval block 中,它也会捕获发生的任何错误。这有一个非常有用的属性,您可以在错误发生的确切位置停止代码,收集实际错误的堆栈跟踪,将其包装在一个对象中,然后使用该对象作为参数手动调用 die。

这种滥用 $SIG{__DIE__}已弃用。正式来说,你应该替换 $SIG{__DIE__}*CORE::GLOBAL::die .但是,这两个是不是 远程等效。 *CORE::GLOBAL::die不是 发生运行时错误时调用!它所做的只是替换对 die() 的显式调用。 .

我对更换模具不感兴趣。

我对捕捉运行时错误特别感兴趣。

我需要确保任何函数、任何深度、任何模块中的任何运行时错误都会导致 Perl 将控制权传递给我,以便我可以收集堆栈跟踪并重新抛出。这需要在 eval block 内工作——一个或多个封闭的 eval block 可能想要捕获异常,但运行时错误可能出现在没有封闭 eval 的函数中,在任何模块内,来自任何地方。
$SIG{__DIE__}完美地支持这一点——并且忠实地为我服务了几年或更长时间——但 Powers that Be™ 警告说,这个奇妙的设施随时可能被抢走,我不希望有一天会有一个令人讨厌的惊喜.

理想情况下,对于 Perl 本身,他们可以创建一个新信号 $SIG{__RTMERR__}为此目的(无论如何,对我来说,切换信号很容易,因为它只卡在一个地方)。不幸的是,我的说服力不会导致酒鬼打开瓶子,所以假设这不会发生,那么究竟应该如何实现干净地捕捉运行时错误的目标呢?

(例如,这里的另一个答案推荐 Carp::Always,这……也钩住了 DIE!)

最佳答案

去做就对了。我已经做到了。可能知道这个钩子(Hook)的每个人都做过。

这是 Perl;几十年前它仍然兼容。我在这里将“弃用”解释为“如果您不需要它,请不要使用它,呃,恶心”。但是您确实需要它,并且似乎理解其中的含义,所以我选择了它。我严重怀疑一个不可替代的语言功能很快就会消失。

并在 CPAN 上发布你的工作,这样下一个开发人员就不需要再重新发明它了。 :)

关于perl - 在 Perl 中捕获运行时错误并转换为异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19668942/

相关文章:

unix - Cygwin错误消息—二进制文件不可执行

c - 使用堆将元素插入优先级队列

html - Perl Mechanize 打印 HTML 表单名称

perl - 如何开始学习 perl

regex - Perl 在多行上拆分长替换正则表达式

perl - 在安装 conda 包期间更新 @INC 变量

perl - 当一个参数错误地将另一个参数作为其值时,perl 中的多个命令行参数

java - 日期输入验证 - 修复 java.lang.numberformatexception 错误

python - 尝试使用 python 在 xlwt 中设置单元格颜色时丢失属性错误

python - CalledProcessError 退出状态代码 5