在现代 Python 中声明自定义异常类的正确方法是什么?我的主要目标是遵循其他异常类所具有的任何标准,以便(例如)我在异常中包含的任何额外字符串都由捕获异常的任何工具打印出来。
我所说的“现代 Python”是指将在 Python 2.5 中运行但对于 Python 2.6 和 Python 3.* 做事方式“正确”的东西。 “自定义”是指 Exception
对象,它可以包含有关错误原因的额外数据:字符串,也可能是与异常相关的其他任意对象。
我被 Python 2.6.2 中的以下弃用警告绊倒了:
>>> class MyError(Exception):
... def __init__(self, message):
... self.message = message
...
>>> MyError("foo")
_sandbox.py:3: DeprecationWarning: BaseException.message has been deprecated as of Python 2.6
似乎很疯狂 BaseException
对于名为 message
的属性具有特殊含义。我从 PEP-352 中收集到,该属性在 2.5 中确实具有特殊含义,他们正试图弃用,所以我猜这个名称(以及那个名称)现在被禁止了?啊。
我也模糊地意识到 Exception
有一些神奇的参数 args
,但我从来不知道如何使用它。我也不确定这是否是未来做事的正确方式;我在网上找到的很多讨论表明他们试图在 Python 3 中取消 args。
更新:两个答案建议覆盖 __init__
和 __str__
/ __unicode__
/ __repr__
这似乎是很多打字,有必要吗?
原文由 Nelson 发布,翻译遵循 CC BY-SA 4.0 许可协议
也许我错过了这个问题,但为什么不呢:
要覆盖某些内容(或传递额外的参数),请执行以下操作:
这样,您可以将错误消息的 dict 传递给第二个参数,然后使用
e.errors
进行处理。在 Python 2 中,您必须使用这种稍微复杂的
super()
形式: