[Go to site: main page, start]

Исключения

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

  • Метод getDriverCode() возвращает код ошибки от драйвера базы данных.
  • Метод getSqlState() возвращает код SQLSTATE.
  • Методы getQueryString() и getParameters() позволяют получить исходный запрос и его параметры.

Класс DriverException расширяют следующие специализированные исключения:

  • ConnectionException – обозначает неудачу при подключении к серверу базы данных.
    • ConnectionLostException .{data-version:3.2.9} – соединение было разорвано во время операции (перезапуск сервера, сбой сети, idle timeout); перед дальнейшим использованием нужно переподключиться.
  • ConstraintViolationException – базовый класс для нарушений ограничений базы данных, от которого наследуются следующие исключения:
    • ForeignKeyConstraintViolationException – нарушение ограничения внешнего ключа.
    • NotNullConstraintViolationException – нарушение ограничения NOT NULL.
    • UniqueConstraintViolationException – нарушение ограничения уникальности.
    • CheckConstraintViolationException .{data-version:3.2.9} – нарушение ограничения CHECK.
  • DeadlockException .{data-version:3.2.9} – deadlock или сериализационный конфликт, обнаруженный сервером; транзакция была откачена и может быть повторена.
  • LockTimeoutException .{data-version:3.2.9} – превышено время ожидания блокировки; инструкция была прервана, но окружающая транзакция обычно остаётся открытой.

Следующий пример показывает, как перехватить UniqueConstraintViolationException, которое возникает при попытке вставить пользователя с адресом электронной почты, уже существующим в базе данных (при условии, что у столбца email есть уникальный индекс):

try {
	$database->query('INSERT INTO users', [
		'email' => 'john@example.com',
		'name' => 'John Doe',
		'password' => $hashedPassword,
	]);
} catch (Nette\Database\UniqueConstraintViolationException $e) {
	echo 'A user with this email already exists.';

} catch (Nette\Database\DriverException $e) {
	echo 'An error occurred during registration: ' . $e->getMessage();
}