我得到的BaseException.message在Python 2.6中弃用时,我用下面的用户定义的异常警告:
class MyException(Exception):
def __init__(self, message):
self.message = message
def __str__(self):
return repr(self.message)
这是警告:
DeprecationWarning: BaseException.message has been deprecated as of Python 2.6
self.message = message
这有什么错呢? 我有什么改变摆脱弃用警告?
解决方案 - 几乎没有编码需要
刚刚从继承您的异常类Exception
,并传递消息作为第一个参数的构造函数
例:
class MyException(Exception):
"""My documentation"""
try:
raise MyException('my detailed description')
except MyException as my:
print my # outputs 'my detailed description'
您可以使用str(my)
或(那么优雅) my.args[0]
访问自定义消息。
背景
在Python的新版本(2.6),我们都应该继承异常我们自定义的异常类,其( 在Python 2.5开始 )从BaseException继承。 背景被详细描述于PEP 352 。
class BaseException(object):
"""Superclass representing the base of the exception hierarchy.
Provides an 'args' attribute that contains all arguments passed
to the constructor. Suggested practice, though, is that only a
single string argument be passed to the constructor."""
__str__
和__repr__
以有意义的方式已经实施,特别是对于只有一个arg的情况下(即可以用作消息)。
你不需要重复__str__
或__init__
实现或创建_get_message
别人的建议。
是的,它是不推荐使用在Python 2.6,因为它会走在Python 3.0
BaseException类不提供一种方法来存储错误信息了。 你必须自己实现它。 您可以使用一个属性用于存储信息的子类做到这一点。
class MyException(Exception):
def _get_message(self):
return self._message
def _set_message(self, message):
self._message = message
message = property(_get_message, _set_message)
希望这可以帮助
class MyException(Exception):
def __str__(self):
return repr(self.args[0])
e = MyException('asdf')
print e
这是你在python2.6的样式类。 新的异常需要的参数任意数量。
如何复制警告
让我澄清一下这个问题,因为一个不能用的问题的示例代码复制此,这将复制警告在Python 2.6和2.7,如果你有警告开启(通过-W
标志 ,该PYTHONWARNINGS
环境变量,或警告模块 ):
>>> error = Exception('foobarbaz')
>>> error.message
__main__:1: DeprecationWarning: BaseException.message has been deprecated as of Python 2.6
'foobarbaz'
同时仍然使用消除了警告.message
而你摆脱的方式DeprecationWarning
是继承一个内置的例外,因为Python的设计意图:
class MyException(Exception):
def __init__(self, message, *args):
self.message = message
# delegate the rest of initialization to parent
super(MyException, self).__init__(message, *args)
>>> myexception = MyException('my message')
>>> myexception.message
'my message'
>>> str(myexception)
'my message'
>>> repr(myexception)
"MyException('my message',)"
可替代地,避免.message
属性
但是,它可能是最好避免消息属性开始,只是拿str
的错误。 只要继承Exception
:
class MyException(Exception):
'''demo straight subclass'''
与用法:
>>> myexception = MyException('my message')
>>> str(myexception)
'my message'
也看到这个答案:
正确的方式在现代Python来声明自定义异常?
据我所知道的,只是使用不同的名称为消息属性避免了与基类中的冲突,从而停止弃用警告:
class MyException(Exception):
def __init__(self, message):
self.msg = message
def __str__(self):
return repr(self.msg)
似乎是一个黑客给我。
也许有人可以解释为什么发出警告,即使子类定义了一个明确的信息属性。 如果基类不再有这个属性,不应该是一个问题。
持续的geekQ的答案 ,首选的代码替换取决于你需要做什么:
### Problem
class MyException(Exception):
"""My documentation"""
try:
raise MyException('my detailed description')
except MyException as my:
### Solution 1, fails in Python 2.x if MyException contains