如何从可能不可用的模块中捕获特定错误

时间:2014-01-09 07:45:33

标签: python exception-handling django-database

我有一个django项目,支持多个数据库后端。我想要检查(为了向用户打印合理的错误消息)普通查询集运算符上的错误是什么。当数据库主机无法访问或未在指定端口运行数据库服务(或凭据无效等)时,我想捕获cx_Oracle.DatabaseErrorpsycopg2.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 个答案:

答案 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)