【问题标题】:How to catch specific errors from modules that might not be available如何从可能不可用的模块中捕获特定错误
【发布时间】:2014-01-09 07:45:33
【问题描述】:

我有一个 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)

...但是有没有更惯用或更漂亮的方式?

【问题讨论】:

    标签: python exception-handling django-database


    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-07
      • 2020-10-02
      • 2018-06-06
      • 1970-01-01
      • 2021-08-31
      • 2019-08-19
      相关资源
      最近更新 更多