Nette Documentation Preview

syntax
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) :

```php
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();
}
```

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