我有一个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)
......但是有更惯用或更漂亮的方式吗?
答案 0 :(得分: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)