BaseException.message不赞成在Python 2.6(BaseException.

2019-06-18 10:31发布

我得到的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

这有什么错呢? 我有什么改变摆脱弃用警告?

Answer 1:

解决方案 - 几乎没有编码需要

刚刚从继承您的异常类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别人的建议。



Answer 2:

是的,它是不推荐使用在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)

希望这可以帮助



Answer 3:

class MyException(Exception):

    def __str__(self):
        return repr(self.args[0])

e = MyException('asdf')
print e

这是你在python2.6的样式类。 新的异常需要的参数任意数量。



Answer 4:

如何复制警告

让我澄清一下这个问题,因为一个不能用的问题的示例代码复制此,这将复制警告在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来声明自定义异常?



Answer 5:

据我所知道的,只是使用不同的名称为消息属性避免了与基类中的冲突,从而停止弃用警告:

class MyException(Exception):

def __init__(self, message):
    self.msg = message

def __str__(self):
    return repr(self.msg)

似乎是一个黑客给我。

也许有人可以解释为什么发出警告,即使子类定义了一个明确的信息属性。 如果基类不再有这个属性,不应该是一个问题。



Answer 6:

持续的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