在现代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__
。这看起来像很多打字,有必要吗?