如何在 Python 3.2 程序中优雅地包含 Python 3.3 from None 异常语法?

2024-04-28

我正在尝试重新引发异常,以便为用户提供有关实际错误的更好信息。 Python 3.3 包括PEP 409 http://www.python.org/dev/peps/pep-0409/。它添加了raise NewException from None语法来抑制原始异常的上下文。

不过,我的目标是 Python 3.2。 Python脚本会解析,但是在运行时如果遇到from None它将产生的语法TypeError: exception causes must derive from BaseException。例如:

try:
    regex_c = re.compile('^{}$'.format(regex)) 
except re.error as e:
    e_msg = 'Regular expression error in "{}"'.format(regex)
    e_reraise = Exception(e_msg)
    # Makes use of the new Python 3.3 exception syntax [from None]
    # to suppress the context of the original exception
    # Causes an additional TypeError exception in Python 3.2
    raise e_reraise from None

封装raise e_reraise from None in a try只会产生更大的异常堆栈跟踪。版本检查也不起作用,因为我的python3.3在 Xubuntu 12.10 上从以下位置提取模块/usr/lib/python3/dist-packages/*这是为 python3.2 模块设置的。 (您将获得方便的Error in sys.excepthook:这创建了一个massive追溯。)

有没有办法在 Python 3.3 中运行时使用 PEP 409 功能,而在 Python 3.2 中默默地忽略它?


您可以设置exc.__cause__ = None在 Python 3.3 中抑制上下文打印:

except re.error as e:
    e_msg = 'Regular expression error in "{}"'.format(regex)
    e_reraise = Exception(e_msg)
    e_reraise.__cause__ = None  # 'raise e_reraise from None'
    raise e_reraise    

在 Python 3.3 中,当您使用raise exc from cause真正发生的是:

exc.__cause__ = cause
raise exc

和设置exc.__cause__依次隐式设置exc.__suppress_context__ = True. See PEP 415 http://www.python.org/dev/peps/pep-0415/,其中详细说明了如何raise exc from None被处理。

当你设置exc.__cause__ = None在 Python 3.2 中,没有任何变化:

$ python3.2
Python 3.2.3 (default, Apr 13 2012, 13:31:19) 
[GCC 4.2.1 Compatible Apple Clang 3.0 (tags/Apple/clang-211.12)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> try:
...     raise ValueError()
... except:
...     exc = TypeError()
...     exc.__cause__ = None
...     raise exc
... 
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
ValueError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 6, in <module>
TypeError

但在 Python 3.3 中,上下文被抑制了:

$ python3.3
Python 3.3.0 (default, Sep 29 2012, 08:16:08) 
[GCC 4.2.1 Compatible Apple Clang 3.1 (tags/Apple/clang-318.0.58)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> try:
...     raise ValueError()
... except:
...     exc = TypeError()
...     exc.__cause__ = None
...     raise exc
... 
Traceback (most recent call last):
  File "<stdin>", line 6, in <module>
TypeError

就像你用过一样raise exc from None:

>>> try:
...     raise ValueError()
... except:
...     raise TypeError() from None
... 
Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
TypeError
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Python 3.2 程序中优雅地包含 Python 3.3 from None 异常语法? 的相关文章

  • 按 A 列删除重复项,保留 B 列中具有最高值的行

    我有一个数据框 A 列中有重复值 我想删除重复项 保留 B 列中具有最高值的行 So this A B 1 10 1 20 2 30 2 40 3 10 应该变成这样 A B 1 20 2 40 3 10 我猜想可能有一种简单的方法可以做到
  • Python3 类型错误:replace() 参数 1 必须是 str,而不是 int

    我已经尝试了几天让这段代码在 MacOS 上运行 但没有成功 你能看一下我错过了什么吗 运行 python 3 6 我已经上传了整个代码 多谢 usr bin env python3 from future import print fun
  • matplotlib:在次要标签下绘制主要刻度标签

    这看起来应该很容易 但我不知道该怎么做 我有一个 X 轴上有时间的图 我想设置两组刻度 小刻度显示一天中的小时 大刻度显示日 月 所以我这样做 set date ticks to something sensible xax ax get
  • 将字段重新格式化为列,其他字段(与先前结构中成为列的字段配对)成为新列中的字段

    我的任务是清理慈善机构设计的移动应用程序中的数据 在一个部分中 用户问答应用程序使用会话由一行表示 该部分由重复的问题答案字段对组成 其中一个字段代表所提出的问题 然后它旁边的字段代表相应的答案 每个问题 字段和答案列对一起代表一个独特的问
  • 用定点迭代求解该方程

    我怎样才能解这个方程 x3 x 1 0 使用定点迭代 有没有定点迭代我可以在网上找到代码 尤其是Python 吗 Using scipy optimize fixed point http docs scipy org doc scipy
  • Python gdal 未定义符号 GDALRasterBandGetVirtualMem

    我正在尝试使用Python GDAL 绑定 https pypi python org pypi GDAL 通过 pip 天真地安装绑定时 安装失败并显示错误 VSIFTruncateL 未在此范围内声明 https gis stackex
  • VS Code Pylint 在缺失的函数/类文档字符串上用蓝色下划线突出显示整个函数

    这种情况突然开始发生 当出现缺少函数文档字符串警告时 python pylint 会用蓝色波浪线突出显示整个函数 我怎样才能让它只突出显示函数定义或在定义行上制作一个小指示器 在开发时突出显示整个文件是非常烦人的 这是缺少类文档字符串的示例
  • 处理异步并行任务的多个异常

    Problem 多个任务并行运行 所有任务 没有任务或其中任何任务都可能抛出异常 当所有任务完成后 必须报告所有可能发生的异常 通过日志 电子邮件 控制台输出 等等 预期行为 我可以通过 linq 使用异步 lambda 构建所有任务 然后
  • Python 排列(包括子字符串)

    我遇到过这个帖子 如何在Python中生成列表的所有排列 https stackoverflow com questions 104420 how to generate all permutations of a list in pyth
  • 如何在 Django 1.4 中自定义管理过滤器

    我是 Python 和 Django 开发的新手 我从社区提供的易于阅读的示例中学到了很多东西 但最近我想为 Django 附带的管理控制台实现一个自定义的管理过滤器 我进行了很多搜索 只发现了一些过时的方法来完成它 例如 Django 1
  • 如何在 Python for 循环中获取 GAE ndb 中当前记录的密钥?

    我目前有一个网页 其中显示数据存储中的记录列表以及编辑链接 我想从数据库转换它 至新开发银行 我是 Python 和 GAE 新手 当前代码 tbody for listtype in listtypes tr td listtype Li
  • 有效地写入 pandas 中的多个相邻列

    使用 numpy ndarray 可以一次写入多个列 而无需先进行复制 只要它们相邻 如果我想写入数组的前三列 我会写 a 0 0 3 1 2 3 this is very fast a is a numpy ndarray 我希望在 pa
  • 更新或插入 MySQL Python

    如果记录已存在 我需要更新一行 如果不存在 我需要创建一个新记录 我理解 ON DUPLICATE KEY 将使用 MYSQLdb 完成此操作 但是我无法使其正常工作 我的代码如下 cursor database cursor cursor
  • 我无法设置顶级标题

    我想为 TopLevel 设置标题 但 TopLevel 显示 Root 的标题 我认为我的下一个脚本与 TkInter 文档中的示例相对应 但给了我不好的结果 你能解释一下 为什么我的设置master title 顶部 in 应用程序顶部
  • 如何在Python中获取套接字的外部IP?

    当我打电话时socket getsockname 在套接字对象上 它返回我的机器的内部 IP 和端口的元组 但是 我想找回我的外部IP 最便宜 最有效的方式是什么 如果没有外部服务器的配合 这是不可能的 因为您和另一台计算机之间可能存在任意
  • Django admin.py 未知命令:'collectstatic'

    我已经从 django 1 2 7 升级到 django 1 5 1我正在使用 python 2 6 6当我尝试跑步时python manage py collectstatic i get 未知命令 collectstatic 从我的设置
  • 使用枚举名称而不是值对 Pydantic 字段进行编码

    我有一个枚举类 class Group enum Enum user 0 manager 1 admin 2 我有一个 pydantic 模型 class User BaseModel id int username str group G
  • 使用 pyspark 计算所有可能的单词对

    我有一个文本文档 我需要找到整个文档中重复单词对的可能数量 例如 我有下面的word文档 该文档有两行 每行用 分隔 文档 My name is Sam My name is Sam My name is Sam My name is Sa
  • 将非方邻接矩阵导入 Networkx python

    我在下面有一些 pandas 数据框形式的数据 其中列代表离散技能 行代表离散工作 仅当工作需要该技能时才存在 1 否则为 0 skill 1 skill 2 job 1 1 0 job 2 0 0 job 3 1 1 我想使用 netwo
  • Pandas:如何删除以 nan 作为列名的多个列?

    根据标题 这是一个可重现的示例 raw data x this that this that this np nan np nan np nan np nan np nan np nan y np nan np nan np nan np

随机推荐