Исключения
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();
}