您在 Perl 程序中使用异常类吗?为什么或者为什么不?

2023-12-19

我有很多关于人们如何在 Perl 中使用异常的问题。我已经包含了一些有关例外情况的背景说明,如果您愿意,可以跳过此内容,但请花点时间阅读问题并做出答复。

Thanks.

Perl 异常的背景

Perl 有一个非常基本的内置异常系统,为更复杂的使用提供了跳板。

例如die "I ate a bug.\n";抛出异常,并将字符串分配给$@.

您还可以抛出一个对象,而不是字符串:die BadBug->new('I ate a bug.');

您甚至可以安装信号处理程序来捕获 SIGDIE 伪信号。这是一个处理程序,它将异常作为对象重新抛出(如果尚未抛出异常)。

$SIG{__DIE__} = sub { 
    my $e = shift; 
    $e = ExceptionObject->new( $e ) unless blessed $e;
    die $e;
}

此模式用于许多 CPAN 模块。但 perlvar 说:

由于实施故障, $SIG{DIE} 钩子称为偶数 在 eval() 内。不要用它来 重写 $@ 中的待处理异常,或者 作为压倒一切的奇怪替代品 核心::全球::死()。这奇怪的 远距离动作可以固定在 未来版本以便 $SIG{DIE} 仅当您的程序是时才被调用 即将退出,与原来一样 意图。不推荐使用任何其他用途。

所以现在我想知道 sigdie 中的对象化异常是否是邪恶的。

问题

  1. 你使用异常对象吗?如果有,是哪一个以及为什么?如果没有,为什么不呢?

  2. 如果您不使用异常对象,什么会吸引您使用它们?

  3. 如果您确实使用异常对象,您讨厌它们什么,还有什么可以更好?

  4. 在 DIE 处理程序中对象化异常是一个坏主意吗?

  5. 我应该在哪里具体化我的异常?在我的 eval{} 包装中?在 sigdie 处理程序中?

  6. 是否有任何关于一般异常和 Perl 中的异常的论文、文章或其他资源,您认为有用或有启发性。

交叉发布于佩尔蒙克斯 http://perlmonks.org/?node_id=828478.


我不经常使用异常对象;主要是因为字符串通常就足够了并且涉及的工作较少。这是因为程序通常对异常无能为力。如果它可以避免异常,那么它一开始就不会导致异常。

如果您可以对异常采取一些措施,请使用对象。如果您只是要终止程序(或某个子集,例如 Web 请求),那么您就不必费力去设计一个复杂的对象层次结构,这些对象除了包含一条消息之外什么也不做。

至于4号;$SIG{__DIE__}永远不应该使用。它不作曲;如果一个模块期望 sigdie 以一种方式工作,而加载另一个模块使其以其他方式工作,则这些模块不能再在同一程序中使用。所以不要这样做。

如果你想使用对象,就做非常无聊的事情die Object->new( ... )。它可能不像某个地方的超级神奇魔法那样令人兴奋,但它总是有效,并且代码完全按照它所说的那样执行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

您在 Perl 程序中使用异常类吗?为什么或者为什么不? 的相关文章

随机推荐

  • jQuery 多个选择器与 .val()

    考虑 id txtYear val 为什么这只给我在第一个输入框中输入的值 其ID以 txtYear 开头 我想获取 ID 以 txtYear 开头的所有输入框的值 这就是 val 的工作原理 您必须循环遍历元素才能获取所有值 let va
  • 在 d3.js 中,对于空数据跳过append()

    我正在用小圆项目符号绘制折线图 但是 数据中存在漏洞 这些漏洞在我的数组中由 null 表示 当然 没有数据的地方就不应该有圆圈 但 d3 的append 方法无论如何都会添加它们 我该如何避免这种情况 这是一个jsFiddle 样机 ht
  • 从 .glsl 文件读取 OpenGL 着色器语言

    我正在尝试从文件中读取着色器字符串 但是 我遇到了一个问题glShaderSource 功能线 如你所知 glShaderSource takes const char 我必须声明char 用于从文件中读取 因此 我使用强制转换来转换类型
  • .NET 异常有多慢?

    我不想讨论何时抛出异常以及不抛出异常 我想解决一个简单的问题 99 的情况下 不抛出异常的争论都围绕着异常缓慢而另一方声称 通过基准测试 速度不是问题 我读过大量与这一方面或另一方面相关的博客 文章和帖子 那么是哪一个呢 答案中的一些链接
  • 列表理解同时迭代两个变量[重复]

    这个问题在这里已经有答案了 是否有可能使用列表理解同时迭代两个变量 同时增加两个变量的循环位置 请参阅下面的示例 a 1 2 3 4 5 b 6 7 8 9 10 c i j for i in a for j in b This works
  • 在 Java 中如何查找前 2 个星期一的日期?

    可能是这样的 for int i 0 i lt 15 i Calendar cal new GregorianCalendar cal add Calendar DAY OF MONTH 1 if cal Calendar DAY OF W
  • 如何使用 JS (Internet Explorer) 以编程方式下载文件

    我有一个网页 其中有一个按钮 单击该按钮后 会生成一个 通过从 json 进行转换 csv 文件 该文件由浏览器下载 它本质上使用了这个逻辑jsfiddle https jsfiddle net 1ecj1rtz 这一切在 Chrome 中
  • C# DataGridViewButtonCell 设置按钮文本

    我需要添加我的DataGridViewButtonCell to Column 并且我需要用不同的名字来命名彼此 但我没有找到任何文本属性 有人可以帮我吗 我做那些事 DataGridViewButtonCell b new DataGri
  • linux如何删除第N行的最后一个字符

    我有一个具有类似结构的大文档 Data800 Data900 Data1000 我将如何删除第三行到最后一行的最后一个字符 在本例中 逗号位于 Data1000 旁边 输出应如下所示 Data800 Data900 Data1000 它始终
  • 系统上的 -isystem 包含目录会导致错误

    下面的代码是怎么回事 include
  • ValueError:无法从重复的轴 Pandas 重新索引

    所以我有一个基于fund id生成的时间序列数组 def get adj nav self fund id df nav read frame super class self filter fund id fund id nav gt 0
  • 使用 autofac 创建需要参数的对象的正确方法是什么?

    我想我已经了解了有关依赖倒置和使用 IoC 容器的大部分知识 但有一件事对我来说仍然不太清楚 如何使用 autofac 来自动化以下工厂 public class WidgetFactory public static IWidget Cr
  • 计算颜色值关系[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有可以计算两种颜色之间关系的网络应用程序 我有一个现有的样式指南 其中包含已确定的十六进制值 我想将
  • 我无法从 Firebase 存储(Angular/Ionic)获取图像 downloadUrl

    我正在尝试从 firebase 获取图像的 downloadUrl 所有属性 如 timeCreated fullPath contentType 都运行良好并正确推送 但我不知道为什么 downloadUrl 不起作用 captureAn
  • $_POST 中的 JQuery Mobile POST 数据为空

    我遇到了 JQuery Mobile 对我来说是新的 和 AJAX 调用的问题 我正在使用以下代码 ajax type POST url http correct url post todoitem beforeSend addHeader
  • 将富文本粘贴到 Flash 中?

    粘贴到 Flash 时是否可以捕获富文本 使用 Flex TextEditArea 我可以在 Flash 本身中粘贴格式丰富的文本 但如果我尝试从外部源 例如网页 Microsoft Word 等 粘贴 它会以纯文本形式出现 反之亦然 如果
  • 如何在 Nuxt 2 或 3 中使用 .env 变量?

    我的项目根目录中有 env 文件 在我的 nuxt 配置中 我使用变量来配置 ReCaptcha 如下所示 import dotenv from dotenv dotenv config export default modules nux
  • 基于 SQLite 支持的 ContentProvider 更新 ListView

    我是一名新的 Android 开发人员 似乎有点不知所措 当我向列表添加更多内容时 我试图进行 listView 更新 ListView 基于 SQLite 数据库 我能够通过为 SQLite 数据库创建一个 ContentProvider
  • 无法将数据写入 Firebase 实时数据库 Android

    我创建了一个 Firebase 并且可以将数据写入身份验证 但是 我无法将数据写入实时数据库 I have connected to Firebase 我已经添加了实时数据库 Import the BoM for the Firebase
  • 您在 Perl 程序中使用异常类吗?为什么或者为什么不?

    我有很多关于人们如何在 Perl 中使用异常的问题 我已经包含了一些有关例外情况的背景说明 如果您愿意 可以跳过此内容 但请花点时间阅读问题并做出答复 Thanks Perl 异常的背景 Perl 有一个非常基本的内置异常系统 为更复杂的使