[Go to site: main page, start]

Exceptions

Nette Database verwendet eine Hierarchie von Exceptions. Die Basisklasse ist Nette\Database\DriverException, die PDOException erweitert und erweiterte Möglichkeiten für die Arbeit mit Datenbankfehlern bietet:

  • Die Methode getDriverCode() gibt den Fehlercode des Datenbanktreibers zurück.
  • Die Methode getSqlState() gibt den SQLSTATE-Code zurück.
  • Die Methoden getQueryString() und getParameters() erlauben es, die ursprüngliche Query und ihre Parameter abzurufen.

Die Klasse DriverException wird von den folgenden spezialisierten Exceptions erweitert:

  • ConnectionException – zeigt an, dass die Verbindung zum Datenbankserver fehlgeschlagen ist.
    • ConnectionLostException .{data-version:3.2.9} – die Verbindung wurde während einer Operation abgebrochen (Serverneustart, Netzwerkausfall, Idle Timeout); vor der weiteren Verwendung ist ein Reconnect nötig.
  • ConstraintViolationException – die Basisklasse für Verletzungen von Datenbank-Constraints, von der die folgenden Exceptions erben:
    • ForeignKeyConstraintViolationException – Verletzung eines Fremdschlüssel-Constraints.
    • NotNullConstraintViolationException – Verletzung eines NOT-NULL-Constraints.
    • UniqueConstraintViolationException – Verletzung eines Eindeutigkeits-Constraints.
    • CheckConstraintViolationException .{data-version:3.2.9} – Verletzung eines CHECK-Constraints.
  • DeadlockException .{data-version:3.2.9} – ein vom Server erkannter Deadlock oder Serialisierungskonflikt; die Transaktion wurde zurückgerollt und kann wiederholt werden.
  • LockTimeoutException .{data-version:3.2.9} – eine Zeitüberschreitung beim Warten auf eine Sperre; die Anweisung wurde abgebrochen, die umgebende Transaktion bleibt aber in der Regel offen.

Das folgende Beispiel zeigt, wie man eine UniqueConstraintViolationException abfängt, die auftritt, wenn man einen Benutzer mit einer E-Mail-Adresse einfügen will, die bereits in der Datenbank existiert (vorausgesetzt, die Spalte email hat einen Unique-Index):

try {
	$database->query('INSERT INTO users', [
		'email' => 'john@example.com',
		'name' => 'John Doe',
		'password' => $hashedPassword,
	]);
} catch (Nette\Database\UniqueConstraintViolationException $e) {
	echo 'Ein Benutzer mit dieser E-Mail-Adresse existiert bereits.';

} catch (Nette\Database\DriverException $e) {
	echo 'Bei der Registrierung ist ein Fehler aufgetreten: ' . $e->getMessage();
}