Исключение InternalError
Исключение InternalError наследуется от DBAPIError
и представляет ошибку, возникшую внутри самой базы данных
или драйвера. Оно поднимается, когда СУБД сообщает
о внутреннем сбое: повреждении курсора, сбое транзакции,
некорректном состоянии соединения и тому подобном.
Первым параметром исключение принимает текст сообщения
об ошибке, а также может содержать исходное исключение
драйвера в атрибуте orig.
В отличие от OperationalError, которое связано
с проблемами подключения, и ProgrammingError,
которое возникает из-за неверного SQL, InternalError
указывает на то, что сам запрос был корректен, но база
данных не смогла его выполнить по внутренним причинам.
Синтаксис
from sqlalchemy.exc import InternalError
raise InternalError(statement, params, orig)
Пример
Давайте рассмотрим иерархию наследования класса
InternalError и убедимся, что он относится
к группе ошибок DBAPIError:
from sqlalchemy.exc import InternalError, DBAPIError, SQLAlchemyError
print(issubclass(InternalError, DBAPIError))
print(issubclass(InternalError, SQLAlchemyError))
Результат выполнения кода:
True
True
Пример
Давайте создадим экземпляр исключения InternalError
вручную и посмотрим на его атрибуты:
Результат выполнения кода:
SELECT 1
{}
internal cursor failure
(builtins.Exception) internal cursor failure
[SQL: SELECT 1]
Пример
Давайте перехватим InternalError при работе
с реальной базой данных. В этом примере мы специально
вызовем ошибку через некорректное обращение к драйверу:
from sqlalchemy import create_engine, text
from sqlalchemy.exc import InternalError
engine = create_engine('sqlite:///:memory:')
with engine.connect() as conn:
try:
conn.execute(text('SELECT * FROM missing_table'))
except InternalError as err:
print('InternalError caught:')
print(err.orig)
В данном случае SQLite вернёт ошибку отсутствующей таблицы,
которая в SQLAlchemy может быть представлена как
OperationalError. Аналогично перехватывается
и InternalError, если драйвер сообщает о внутреннем
сбое. Результат может выглядеть так:
"InternalError caught:"
Пример
Давайте напишем универсальный обработчик, который
различает InternalError и другие ошибки
семейства DBAPIError:
from sqlalchemy import create_engine, text
from sqlalchemy.exc import InternalError, OperationalError, DBAPIError
engine = create_engine('sqlite:///:memory:')
def run_query(conn, query):
try:
res = conn.execute(text(query))
return res.fetchall()
except InternalError as err:
print('Internal DB failure:', err.orig)
except OperationalError as err:
print('Operational failure:', err.orig)
except DBAPIError as err:
print('Other DBAPI failure:', err.orig)
with engine.connect() as conn:
run_query(conn, 'SELECT 1')
Результат выполнения кода:
[(1,)]
Смотрите также
-
исключение
SQLAlchemyError,
которое является базовым для всех ошибок библиотеки -
исключение
DBAPIError,
которое объединяет ошибки драйверов баз данных -
исключение
OperationalError,
которое сигнализирует о проблемах соединения и работы СУБД -
исключение
InterfaceError,
которое возникает при ошибках взаимодействия с интерфейсом драйвера