Как отловить конкретные ошибки из модулей, которые могут быть недоступны

У меня есть проект 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)
Другие вопросы по тегам