Исключение 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