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

しかし、ロールバックによっても例外が発生する場合 (接続に失敗した場合など) はどうでしょうか? 入れ子になった try-except ブロックを except ブロックの中に入れる必要がありますか?

4

2 に答える 2

2

ネストされた try ... except ブロックを except ブロックに配置することが解決策です。しかし、私は最後に使用します:

try:
  ...
except ... :

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

つまり、ロールバックが失敗した場合、他に行うことはほとんどなく、例外とクリーンアップをログに記録しますよね?

于 2012-10-05T12:10:49.193 に答える
0

ここから推奨事項を確認することをお勧めします

PEPによると、ここで強調したい主なポイントは次のとおりです。

  • 一般的な例外をキャッチしない
  • 一般的な例外を発生させない
于 2014-09-16T09:45:34.817 に答える