Tim-ats

Articles

Lever une erreur proprement en Python

En Python le mécanisme d'exception est très puissant : on peut lever ses propres erreurs, les intercepter et les traiter.

Ce mécanisme fait partie intégrante du workflow du langage, Python déclenchant une StopIteration erreur pour stopper une boucle for (cf l'article de Sam et Max sur le sujet).

Hier, je devais lever une erreur que j'avais moi-même crée. J'ai donc commencé par faire cela :

class NoPaperError(Exception):
    error_message = "Please insert sheets of paper."

raise NoPaperError(NoPaperError.error_message)

Puis ceci :

class NoPaperError(Exception):
    """Please insert sheets of paper."""

raise NoPaperError(NoPaperError.__doc__)

La seconde solution étant moins verbeuse mais très moche à sa façon : l'explicitation de l'erreur n'ayant rien à faire dans la documentation de la classe.

Finalement, la solution m'est venue d'un membre d'un serveur Discord :

class NoPaperError(Exception):

    def __str__(self):
        return "Please insert sheets of paper."

raise NoPaperError

Plus besoin d'accéder à l'explicitation de l'erreur via un attribut de classe ou sa documentation, Python le fait automatiquement grâce à la méthode spéciale __str__. Cette "méthode magique" permet de modifier la représentation en chaîne de caractère d'une instance de classe et, par conséquent, le message d'erreur affiché quand l'exception sera déclenchée (cf la documentation associée).

De plus, l'utilisation de cette méthode permet de générer des messages d'erreurs "dynamiques", les attributs de ladite erreur étant accessibles facilement.

Ainsi,

class NoPaperError(Exception):

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

    def __str__(self):
        return f"Please insert sheets of paper in the slot {self.slot}."

raise NoPaperError(5)

produira :

Traceback (most recent call last):
File "error.py", line 9, in <module>
    raise NoPaperError(5)
__main__.NoPaperError: Please insert sheets of paper in the slot 5.