0

当我执行一个简单的查询(我正在使用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

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

4

2 回答 2

2

在 except 块中放置嵌套的 try ... except 块是一种解决方案。但我最终会使用:

try:
  ...
except ... :

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

我的意思是,如果回滚失败,那么几乎没有其他事情可做,然后记录异常并进行清理,对吗?

于 2012-10-05T12:10:49.193 回答
0

最好从这里检查建议

根据 PEP,我想在这里强调的要点:

  • 不要抓住一般异常
  • 不要引发一般异常
于 2014-09-16T09:45:34.817 回答