184 votes

BaseException.message obsolète en Python 2.6

Je reçois un avertissement que BaseException.le message est obsolète dans la version 2.6 de Python quand j'utilise la suite définie par l'utilisateur exception:

class MyException(Exception):

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

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

C'est l'avertissement:

DeprecationWarning: BaseException.message has been deprecated as of Python 2.6
self.message = message

Quel est le problème avec cela? Que dois-je changer de se débarrasser de la dépréciation d'avertissement?

159voto

geekQ Points 8796

Solution - presque aucun codage nécessaire

  1. Juste d'hériter de votre classe d'exception à partir de Exception
  2. et de passer le message que le premier paramètre du constructeur

Exemple:

class MyException(Exception):
    """My documentation"""

try:
    raise MyException('my detailed description')
except MyException as my:
    print my # outputs 'my detailed description'

Vous pouvez utiliser str(my) ou (moins élégant) my.args[0] pour accéder au message personnalisé.

Arrière-plan

Dans les nouvelles versions de Python (2,6) nous sommes censés hériter de nos classes d'exception de l'Exception, qui (à partir de Python 2.5) hérite de BaseException. L'arrière-plan est décrit en détail dans PEP352.

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__ et __repr__ sont déjà mis en œuvre de façon significative, surtout pour le cas de seulement un arg (qui peut être utilisée comme message).

Vous n'avez pas besoin de répéter __str__ ou __init__ de la mise en œuvre ou créez - _get_message comme suggéré par d'autres.

25voto

Sahas Points 1709

Oui, il est déconseillé dans la version 2.6 de Python, car il va loin en Python 3.0

BaseException classe ne fournit pas un moyen de stocker de message d'erreur plus. Vous aurez à mettre en œuvre vous-même. Vous pouvez le faire avec une sous-classe qui utilise une propriété pour stocker le message.

class MyException(Exception):
    def _get_message(self): 
        return self._message
    def _set_message(self, message): 
        self._message = message
    message = property(_get_message, _set_message)

Espérons que cette aide

9voto

Maxim Sloyko Points 4091
class MyException(Exception):

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

e = MyException('asdf')
print e

C'est votre classe en Python2.6 style. La nouvelle exception prend un nombre arbitraire d'arguments.

4voto

Hollister Points 902

Aussi loin que je peux dire, simplement en utilisant un nom différent pour le message attribut évite le conflit avec la classe de base, et arrête ainsi la désapprobation d'avertissement:

class MyException(Exception):

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

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

Semble comme un hack pour moi.

Peut-être que quelqu'un peut expliquer pourquoi le message d'avertissement est émis, même lorsque le sous-classe définit un message attribut explicitement. Si la classe de base n'a plus cet attribut, il ne devrait pas être un problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X