Aller au contenu

L'erreur de validation dans Forge

Ce document explique l'exception centrale de validation des entités, son rôle dans le cœur du framework, et comment la lire dans le code applicatif.

Le fichier de code correspondant est core/validation/exceptions.py.

1. Rôle

PropertyValidationError est l'exception unique levée quand une contrainte de propriété n'est pas respectée.

Elle porte deux informations : le nom de la propriété fautive et un message décrivant la raison du refus.
Ainsi, le code qui attrape l'erreur sait exactement quelle propriété a posé problème et peut afficher le bon message au bon endroit.

PropertyValidationError hérite de ValueError.
Un code qui attrape déjà ValueError capture donc aussi les erreurs de validation Forge.

from core.validation import PropertyValidationError

try:
    article.title = ""
except PropertyValidationError as error:
    print(error.property_name)  # "title"
    print(error.message)        # la raison du refus

2. Vue d'ensemble rapide

Élément Valeur
Classe PropertyValidationError
Module core.validation.exceptions
Couche Validation du cœur
Hérite de ValueError
Rôle signaler une propriété qui ne respecte pas sa contrainte
Levée par les décorateurs de core.validation.decorators
Exposée par core.validation
Attributs property_name, message

3. Schémas UML

3.1 Diagramme de classe

Le diagramme montre la place de PropertyValidationError dans la hiérarchie des exceptions et son lien avec les décorateurs qui la lèvent.

Il permet de voir que PropertyValidationError est une ValueError enrichie de deux attributs nommés, levée par les décorateurs de validation.

classDiagram
    direction LR

    class ValueError {
        <<exception>>
    }

    class PropertyValidationError {
        <<exception>>
        +str property_name
        +str message
    }

    class Decorateur {
        +typed(...)
        +not_empty(...)
        +pattern(...)
    }

    ValueError <|-- PropertyValidationError
    Decorateur ..> PropertyValidationError : leve

À retenir :

  • PropertyValidationError hérite de ValueError ;
  • elle porte property_name et message ;
  • elle est levée par les décorateurs de validation ;
  • un code qui attrape ValueError attrape aussi PropertyValidationError.

4. API publique

Élément Signature Rôle
PropertyValidationError PropertyValidationError(property_name: str, message: str) construit l'exception avec la propriété fautive et le message de refus
property_name attribut str nom de la propriété en cause
message attribut str raison lisible du refus

Le message est aussi l'argument transmis à ValueError, donc str(error) renvoie ce même message.

5. Contextes d'utilisation

Besoin Élément
Identifier la propriété fautive error.property_name
Afficher la raison du refus error.message
Capturer une erreur de validation except PropertyValidationError
Capturer largement les erreurs de valeur except ValueError

En pratique, les décorateurs de validation lèvent cette erreur lors d'une affectation de propriété.
Le code applicatif l'attrape, typiquement dans un contrôleur ou un service de formulaire, pour relier le message au bon champ.

6. Exemples d'utilisation

Attraper l'erreur et lire ses attributs
from core.validation import PropertyValidationError, typed, not_empty


class Article:
    @property
    def title(self) -> str:
        return self._title

    @title.setter
    @typed(str)
    @not_empty
    def title(self, value: str) -> None:
        self._title = value


article = Article()

try:
    article.title = "   "
except PropertyValidationError as error:
    print(error.property_name)  # "title"
    print(error.message)        # la propriété 'title' ne doit pas être vide.
Relier l'erreur à un champ de formulaire
from core.validation import PropertyValidationError


def soumettre(article, data) -> dict[str, str]:
    erreurs: dict[str, str] = {}
    try:
        article.title = data.get("title")
    except PropertyValidationError as error:
        erreurs[error.property_name] = error.message
    return erreurs

Le dictionnaire renvoyé associe chaque propriété fautive à son message, prêt à être affiché sur le bon champ.

Voir aussi