単純なクエリを実行しているとき (私は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
しかし、ロールバックによっても例外が発生する場合 (接続に失敗した場合など) はどうでしょうか? 入れ子になった try-except ブロックを except ブロックの中に入れる必要がありますか?