Výjimky

Nette Database používá hierarchii výjimek. Základní třídou je Nette\Database\DriverException, která dědí z PDOException a poskytuje rozšířené možnosti pro práci s chybami databáze:

  • Metoda getDriverCode() vrací kód chyby od databázového driveru
  • Metoda getSqlState() vrací SQLSTATE kód
  • Metody getQueryString() a getParameters() umožňují získat původní dotaz a jeho parametry

Z DriverException dědí následující specializované výjimky:

  • ConnectionException – signalizuje selhání připojení k databázovému serveru
    • ConnectionLostException .{data-version:3.2.9} – spojení bylo ztraceno během operace (restart serveru, výpadek sítě, idle timeout); před dalším použitím je potřeba se znovu připojit
  • ConstraintViolationException – základní třída pro porušení databázových omezení, ze které dědí:
    • ForeignKeyConstraintViolationException – porušení cizího klíče
    • NotNullConstraintViolationException – porušení NOT NULL omezení
    • UniqueConstraintViolationException – porušení unikátnosti hodnoty
    • CheckConstraintViolationException .{data-version:3.2.9} – porušení CHECK omezení
  • DeadlockException .{data-version:3.2.9} – deadlock nebo serializační konflikt zjištěný serverem; transakce byla zrušena a operaci lze zopakovat
  • LockTimeoutException .{data-version:3.2.9} – vypršel časový limit při čekání na zámek; příkaz byl přerušen, okolní transakce obvykle zůstává otevřená

Příklad zachytávání výjimky UniqueConstraintViolationException, která nastane, když se snažíme vložit uživatele s emailem, který už v databázi existuje (za předpokladu, že sloupec email má unikátní index).

try {
	$database->query('INSERT INTO users', [
		'email' => 'john@example.com',
		'name' => 'John Doe',
		'password' => $hashedPassword,
	]);
} catch (Nette\Database\UniqueConstraintViolationException $e) {
	echo 'Uživatel s tímto emailem již existuje.';

} catch (Nette\Database\DriverException $e) {
	echo 'Došlo k chybě při registraci: ' . $e->getMessage();
}