Как отловить конкретные ошибки из модулей, которые могут быть недоступны
У меня есть проект Django, где поддерживается несколько баз данных. Я хочу проверить (для того, чтобы напечатать ощутимое сообщение об ошибке пользователю), какова ошибка обычного оператора набора запросов, например, я хочу поймать cx_Oracle.DatabaseError
а также psycopg2.OperationalError
и т.д., когда узел базы данных недоступен или не работает служба базы данных на указанном порту (или учетные данные недействительны и т. д.)
Проблема в том, что в моем коде я не знаю, какая резервная копия используется и доступны ли модули.
Я мог бы сделать что-то вроде:
dberrors = list()
try:
from psycopg2 import OperationalError
dberrors.append(OperationalError)
except ImportError:
pass
try:
from cx_Oracle import DatabaseError:
dberrors.append(DatabaseError)
except ImportError:
pass
# and so on
databaseerrors = tuple(databaseerrors)
try:
mymodels.Model.objects.filter()
except databaseerrors as e:
logger.critical("Database host is not accepting connections")
sys.exit(1)
... но есть ли более идиоматичный или красивый способ?
1 ответ
Похоже, по крайней мере, вы могли бы сделать это в цикле...
mod_errors = [
('psycopg', 'OperationalError'),
('cx_Oracle', 'DatabaseError'),
# ... More here.
]
for mod, err in mod_errors:
try:
m = __import__(mod)
except ImportError:
continue
dberrors.append(getattr(m, err))
databaseerrors = tuple(dberrors)