Wyjątki

Nette Database używa hierarchii wyjątków. Klasą bazową jest Nette\Database\DriverException, która rozszerza PDOException i udostępnia rozszerzoną funkcjonalność pracy z błędami bazy danych:

  • Metoda getDriverCode() zwraca kod błędu ze sterownika bazy danych.
  • Metoda getSqlState() zwraca kod SQLSTATE.
  • Metody getQueryString() i getParameters() pozwalają pobrać oryginalne zapytanie i jego parametry.

Klasę DriverException rozszerzają następujące wyspecjalizowane wyjątki:

  • ConnectionException – sygnalizuje niepowodzenie połączenia z serwerem bazy danych.
    • ConnectionLostException .{data-version:3.2.9} – połączenie zostało przerwane w trakcie operacji (restart serwera, awaria sieci, idle timeout); przed dalszym użyciem konieczne jest ponowne połączenie.
  • ConstraintViolationException – klasa bazowa dla naruszeń ograniczeń bazy danych, po której dziedziczą poniższe wyjątki:
    • ForeignKeyConstraintViolationException – naruszenie ograniczenia klucza obcego.
    • NotNullConstraintViolationException – naruszenie ograniczenia NOT NULL.
    • UniqueConstraintViolationException – naruszenie ograniczenia unikalności.
    • CheckConstraintViolationException .{data-version:3.2.9} – naruszenie ograniczenia CHECK.
  • DeadlockException .{data-version:3.2.9} – deadlock albo konflikt serializacji wykryty przez serwer; transakcja została wycofana i można ją powtórzyć.
  • LockTimeoutException .{data-version:3.2.9} – przekroczono czas oczekiwania na blokadę; polecenie zostało przerwane, ale otaczająca transakcja zwykle pozostaje otwarta.

Poniższy przykład pokazuje, jak przechwycić UniqueConstraintViolationException, który powstaje przy próbie wstawienia użytkownika z e-mailem już istniejącym w bazie danych (przy założeniu, że kolumna email ma indeks unikalny):

try {
	$database->query('INSERT INTO users', [
		'email' => 'john@example.com',
		'name' => 'John Doe',
		'password' => $hashedPassword,
	]);
} catch (Nette\Database\UniqueConstraintViolationException $e) {
	echo 'Użytkownik z tym e-mailem już istnieje.';

} catch (Nette\Database\DriverException $e) {
	echo 'Podczas rejestracji wystąpił błąd: ' . $e->getMessage();
}