使用不同的类型和消息重新引发异常,保留现有信息

2023-12-25

我正在编写一个模块,并希望为它可能引发的异常建立一个统一的异常层次结构(例如,从FooError所有的抽象类foo模块的特定例外)。这允许模块的用户捕获这些特定的异常并在需要时明确地处理它们。但是模块引发的许多异常是由于其他一些异常而引发的;例如由于文件上的 OSError 导致某些任务失败。

我需要的是“包装”捕获的异常,使其具有不同的类型和消息,以便通过任何捕获异常的方式在传播层次结构中进一步获取信息。但我不想丢失现有的类型、消息和堆栈跟踪;对于尝试调试问题的人来说,这都是有用的信息。顶级异常处理程序不好,因为我试图在异常进一步传播堆栈之前对其进行装饰,而顶级处理程序为时已晚。

通过派生我的模块部分解决了这个问题foo现有类型的特定异常类型(例如class FooPermissionError(OSError, FooError)),但这并没有使将现有异常实例包装在新类型中或修改消息变得更容易。

蟒蛇的PEP 3134 http://www.python.org/dev/peps/pep-3134/“异常链接和嵌入式回溯”讨论了 Python 3.0 中接受的“链接”异常对象的更改,以指示在处理现有异常期间引发了新异常。

我想做的事情是相关的:我也需要它在早期的Python版本中工作,并且我不需要它用于链接,而仅用于多态性。这样做的正确方法是什么?


Python 3介绍异常链接(如中所述PEP 3134 http://www.python.org/dev/peps/pep-3134/)。这允许在引发异常时引用现有异常作为“原因”:

try:
    frobnicate()
except KeyError as exc:
    raise ValueError("Bad grape") from exc

捕获的异常(exc,一个 KeyError)从而成为新异常 ValueError 的一部分(是“原因”)。 “原因”适用于捕获新异常的任何代码。

通过使用此功能,__cause__属性已设置。内置的异常处理程序还知道如何报告异常的“原因”和“上下文” https://www.python.org/dev/peps/pep-3134/#enhanced-reporting以及回溯。


In Python 2,看来这个用例没有好的答案(如伊恩·比金 http://blog.ianbicking.org/2007/09/12/re-raising-exceptions/ and 内德·巴切尔德 http://nedbatchelder.com/blog/200711/rethrowing_exceptions_in_python.html)。真糟糕。

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

使用不同的类型和消息重新引发异常,保留现有信息 的相关文章

随机推荐

  • Android hprov-dump 给我错误:期待 1.0.3

    我在 eclipses DDMS 中使用了转储 HPROF 文件选项 并将我的 hprof 文件命名为 in hprof 但是当我尝试执行以下操作时hprov conf in hprof out hprof从命令行它给我错误 错误 期待 1
  • 使文本块只读

    目前我在滚动查看器控件中放置了一个文本块 如何使文本块只读 文本块 http msdn microsoft com en us library system windows controls textblock aspx已经是只读的 它们旨
  • 为什么会出现错误 ORA-00937

    对于每名获得三架以上飞机认证的飞行员 找到 援助和他 或她 所乘坐的飞机的最大航程 认证为 我有四张桌子 FLIGHTS flno varchar 出发地 varchar 目的地 varchar 距离 整数 出发 日期 到达 日期 飞机 a
  • Android httpclient cookie拒绝非法路径属性

    我正在构建一个 Android 应用程序 它使用 httpclient 将数据发布到 WordPress 服务器并检索数据 由于 cookie 中的路径无效 我无法发送发布数据 这是我检索到的日志 Cookie rejected Basic
  • 高效解析大型 JSON 数组的前四个元素

    我在用Jackson从 json 解析 JSONinputStream如下所示 36 100 The 3n 1 problem 56717 0 1000000000 0 6316 0 0 88834 0 45930 0 46527 5209
  • 如何复制图像?

    我想复制image png form folder1 to folder2 怎么做 folder1 image png folder2 Thanks 尝试这样的事情 var fs require fs var inStr fs create
  • PHP包含html页面字符集问题

    使用下面的代码查询 mysql 数据库后 我生成了一个 html 文件 myFile page htm fh fopen myFile w 或 die 无法打开文件 fwrite fh row 文本 fclose fh 在 mysql 数据
  • 如何运行内存中下载的文件? [复制]

    这个问题在这里已经有答案了 可能的重复 使用 C 加载 EXE 文件并从内存中运行它 https stackoverflow com questions 3553875 load an exe file and run it from me
  • 从 C++ 中查找 python 函数参数

    我正在从 C 调用 python 函数 我想知道是否可以确定参数的数量和这些参数的名称 我已阅读链接如何从 C 语言中查找 Python 函数的参数数量 https stackoverflow com questions 1117164 h
  • 如何从最小最大算法中获取实际移动而不是移动值

    我目前正在为国际象棋编写一个带有 alpha beta 剪枝的极小极大算法 从我见过的所有示例中 极小极大算法将返回一个 int 值 该值表示最佳得分或最佳移动所产生的棋盘状态 我的问题是我们如何返回与分数返回值相关的最佳动作 例如 下面的
  • 如何将 TensorFlow (v. 2) Hub 中预训练的 KerasLayer 与 tfrecords 结合起来?

    我有一个包含 23 个类的 tfrecord 每个类有 35 张图像 总共 805 张 我当前的 tfrecord 读取函数是 def read tfrecord serialized example feature description
  • knockoutjs 检查绑定

    我遇到了问题checked绑定 单击复选框不会更新可见状态 尽管 dependentObservable 指示值已更改 这是 HTML 片段
  • 如何使用标记创建范围滑块并更改填充范围的颜色?

    我已经在某种程度上完成了工作 如下所示 如何实现像这样的范围滑块 slidecontainer width 100 Width of the outside container The slider itself slider webkit
  • 如何创建一个包含每个项目复选框的组合框?

    对 tkinter 和 python 相当陌生 我想知道如何实现一个像这样的按钮 单击按钮下拉列表 所以这是一个组合框 列表的每一行都有一个复选框 最后 如果单击复选框 则运行一个函数 或者 甚至更好 一旦不再删除组合框 就运行一个将项目检
  • 使用 Azure AD 客户端凭据授予流程的 Azure Devops Access

    我已成功通过 Azure AD 进行身份验证并收到访问令牌 我已授予 Azure AD App API 访问 Azure DevOps 的权限 我正在使用 RestSharp Http 客户端进行身份验证 var client new Re
  • 无法将 NumPy 数组转换为张量(不支持的对象类型字典)

    我的方法我认为问题是 history model fit generator train generator epochs epochs steps per epoch train steps verbose 1 callbacks che
  • R 的 UTF-8 编码问题

    尝试解析墨西哥参议院的参议院声明 但在网页的 UTF 8 编码方面遇到问题 这个html清晰可见 library rvest Senate lt html http comunicacion senado gob mx index php
  • neo4j中计算节点深度

    我在 Neo4j 中有这个查询 MATCH sentence Sentence r gt n Word WITH n COUNT r AS c RETURN n c 我的图是一个语言数据库 包含单词及其之间的依赖关系 此查询应返回节点深度
  • 指南针仅在部分运行

    当我尝试通过键入以下内容在命令行上获取我的版本时 compass version 我收到以下错误 Errno ENOENT on line 25 of usr lib ruby vendor ruby compass version rb
  • 使用不同的类型和消息重新引发异常,保留现有信息

    我正在编写一个模块 并希望为它可能引发的异常建立一个统一的异常层次结构 例如 从FooError所有的抽象类foo模块的特定例外 这允许模块的用户捕获这些特定的异常并在需要时明确地处理它们 但是模块引发的许多异常是由于其他一些异常而引发的