Винятки

Nette Database використовує ієрархію винятків. Базовим класом є Nette\Database\DriverException, який успадковує від PDOException і надає розширені можливості для роботи з помилками бази даних:

  • Метод getDriverCode() повертає код помилки від драйвера бази даних
  • Метод getSqlState() повертає код SQLSTATE
  • Методи getQueryString() та getParameters() дозволяють отримати початковий запит та його параметри

Від DriverException успадковуються наступні спеціалізовані винятки:

  • ConnectionException – сигналізує про збій підключення до сервера бази даних
  • ConstraintViolationException – базовий клас для порушення обмежень бази даних, від якого успадковуються:
    • ForeignKeyConstraintViolationException – порушення зовнішнього ключа
    • NotNullConstraintViolationException – порушення обмеження NOT NULL
    • UniqueConstraintViolationException – порушення унікальності значення

Приклад перехоплення винятку UniqueConstraintViolationException, який виникає, коли ми намагаємося вставити користувача з email, який вже існує в базі даних (за умови, що стовпець email має унікальний індекс).

try {
	$database->query('INSERT INTO users', [
		'email' => 'john@example.com',
		'name' => 'John Doe',
		'password' => $hashedPassword,
	]);
} catch (Nette\Database\UniqueConstraintViolationException $e) {
	echo 'Користувач з цим email вже існує.';

} catch (Nette\Database\DriverException $e) {
	echo 'Сталася помилка під час реєстрації: ' . $e->getMessage();
}
версія: 4.0