Nette Documentation Preview

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

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

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