
__exit__
で後処理を行う
__exit__
メソッドは、
with
文が終了したときに実行する後処理コードの場所を提供します。
log_request
関数の後処理を行うコードを思い出してください。
...
cursor.execute(_SQL, (req.form['phrase'],
req.form['letters'],
req.remote_addr,
req.user_agent.browser,
res, ))
conn.commit()
cursor.close()
conn.close()
後処理コードはデータベースデータをコミットしてから、カーソルと接続を閉じます。この後処理
はデータベースとやり取りす
るたびに生じるので、この
3
行を
__exit__
に移動してコンテキストマ
ネージャに追加しましょう。
しかし、その前に
__exit__
には複雑なところがあり、
with
のブロック内で発生し得る例外を
処理しなくてはいけません。何か問題が生じたら、インタプリタは必ず
exc_type
、
exc_value
、
exc_trace
の
3
つの引数を
__exit__
メソッドに渡して通知します。下の
def
行では、この
3
つの
引数を追加しています。しかし、ここではこの例外処理メカニズムを無視します。後の章で問題が生
じる原因とその対応について説明する際に再び取り上げます。
後処理コードでは後片付けを行います。このコンテキストマネージャの後片付け
では、カーソルと接続の両方を閉じる前にデータベースにデータをコミ ...