Exceptions
Nette Database utilise une hiérarchie d'exceptions. La classe de base est Nette\Database\DriverException, qui
étend PDOException et offre des fonctionnalités enrichies pour travailler avec les erreurs de base de
données :
- La méthode
getDriverCode()renvoie le code d'erreur du driver de base de données. - La méthode
getSqlState()renvoie le code SQLSTATE. - Les méthodes
getQueryString()etgetParameters()permettent d'obtenir la requête d'origine et ses paramètres.
La classe DriverException est étendue par les exceptions spécialisées suivantes :
ConnectionException– signale un échec de connexion au serveur de base de données.ConnectionLostException.{data-version:3.2.9} – la connexion a été perdue au cours d'une opération (redémarrage du serveur, panne réseau, idle timeout) ; une reconnexion est nécessaire avant toute utilisation ultérieure.
ConstraintViolationException– la classe de base des violations de contraintes de la base de données, dont héritent les exceptions suivantes :ForeignKeyConstraintViolationException– violation d'une contrainte de clé étrangère.NotNullConstraintViolationException– violation d'une contrainte NOT NULL.UniqueConstraintViolationException– violation d'une contrainte d'unicité.CheckConstraintViolationException.{data-version:3.2.9} – violation d'une contrainte CHECK.
DeadlockException.{data-version:3.2.9} – deadlock ou conflit de sérialisation détecté par le serveur ; la transaction a été annulée et peut être retentée.LockTimeoutException.{data-version:3.2.9} – le délai d'attente d'un verrou a été dépassé ; l'instruction a été interrompue, mais la transaction environnante reste généralement ouverte.
L'exemple suivant montre comment attraper une UniqueConstraintViolationException, qui survient lorsqu'on tente
d'insérer un utilisateur avec une adresse e-mail déjà présente dans la base (en supposant que la colonne email
porte un index unique) :
try {
$database->query('INSERT INTO users', [
'email' => 'john@example.com',
'name' => 'John Doe',
'password' => $hashedPassword,
]);
} catch (Nette\Database\UniqueConstraintViolationException $e) {
echo 'Un utilisateur avec cet e-mail existe déjà.';
} catch (Nette\Database\DriverException $e) {
echo 'Une erreur est survenue lors de l\'inscription : ' . $e->getMessage();
}