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() et getParameters() 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();
}