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