РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
549 of 1361 menu

Исключение DBALException

Исключение DBALException выбрасывается Doctrine DBAL, когда происходит ошибка на уровне соединения с базой данных или при выполнении SQL-запроса. Оно наследуется от Doctrine\DBAL\Exception и реализует интерфейс Doctrine\DBAL\Driver\Exception. Исключение содержит сообщение об ошибке, SQL-код ошибки, а также исходный драйверный эксепшн. В отличие от ORMInvalidArgumentException оно относится к чистому DBAL и возникает, например, при неверном SQL, нарушении уникальности, потере соединения или синтаксической ошибке в запросе.

Синтаксис

use Doctrine\DBAL\Exception as DBALException; throw DBALException::driverExceptionDuringQuery( $driver, $exception, $sql, $params );

Пример

Давайте получим соединение через Connection и выполним запрос с синтаксической ошибкой, поймав исключение:

<?php namespace App\Controller; use Doctrine\DBAL\DriverManager; use Doctrine\DBAL\Exception as DBALException; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; class ArticleController extends AbstractController { public function index(): Response { $connection = DriverManager::getConnection([ 'url' => 'mysql://user:pass@localhost/db', ]); try { $connection->executeQuery('SELECTT * FROM article'); } catch (DBALException $e) { return new Response($e->getMessage()); } return new Response('ok'); } } ?>

Результат выполнения кода:

"An exception occurred in the driver: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax"

Пример

Давайте поймаем нарушение уникальности и выведем SQL-код ошибки:

<?php namespace App\Controller; use Doctrine\DBAL\DriverManager; use Doctrine\DBAL\Exception as DBALException; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; class ArticleController extends AbstractController { public function index(): Response { $connection = DriverManager::getConnection([ 'url' => 'mysql://user:pass@localhost/db', ]); try { $connection->executeStatement( 'INSERT INTO article (id, title) VALUES (1, ?)', ['abcde'] ); } catch (DBALException $e) { return new Response((string) $e->getCode()); } return new Response('inserted'); } } ?>

Результат выполнения кода:

"23000"

Пример

Давайте перехватим ошибку соединения с базой данных и вернём понятный ответ:

<?php namespace App\Controller; use Doctrine\DBAL\DriverManager; use Doctrine\DBAL\Exception as DBALException; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; class ArticleController extends AbstractController { public function index(): Response { try { $connection = DriverManager::getConnection([ 'url' => 'mysql://user:pass@localhost/db', ]); $connection->connect(); } catch (DBALException $e) { return new Response('database unavailable', 503); } return new Response('connected'); } } ?>

Результат выполнения кода:

"database unavailable"

Смотрите также

  • исключение ORMInvalidArgumentException,
    которое возникает при ошибках Doctrine ORM
  • исключение UniqueConstraintViolationException,
    которое сигнализирует о нарушении уникальности
  • исключение EntityNotFoundException,
    которое выбрасывается при отсутствии сущности
  • исключение HttpException,
    которое лежит в основе HTTP-ошибок Symfony
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить