使用数据库时正确处理异常的方法

时间:2012-10-05 11:35:53

标签: python database exception exception-handling tornado

当我执行一个简单的查询(我正在使用tornado.database模块)时,我处理这样的异常:

try:
    self.application.db.execute('DELETE FROM table_one WHERE a = 1')
except Exception, e:
    logging.warning('DB exception: %s' % e)
    self.set_status(500)
    return

如果我想做一个事务,那么在异常情况下回滚它会很聪明:

try:
    self.application.db.execute('START TRANSACTION')
    self.application.db.execute('DELETE FROM table_one WHERE a = 1')
    self.application.db.execute('DELETE FROM table_two WHERE b = 2')
    self.application.db.execute('COMMIT')
except Exception, e:
    logging.warning('DB exception: %s' % e)
    self.set_status(500)
    self.application.db.execute('ROLLBACK')
    return

但是,如果 rollback 也会导致异常(例如,如果连接失败),该怎么办?我是否需要在except块中放置一个嵌套的try-except块?

2 个答案:

答案 0 :(得分:2)

在块中放置嵌套的try ...除了块是一个解决方案。 但我最后会去使用:

try:
  ...
except ... :

finally:
   # cleanup (close the connection, etc...)

我的意思是如果回滚失败,那么几乎没有其他任何事情要做,然后记录异常和清理,对吧?

答案 1 :(得分:0)

最好检查here

中的建议

根据PEP,我想强调一下要点:

  • 不要抓住一般的例外
  • 不提出一般例外