tryの使い方

私はずっとtry - catch - finallyの使いどころがわからず、苦手にしてきたのですが、なんとなく掴めてきたように思います。なお、pythonではtry - except - finallyです。

Pythonにおけるtryには、except、else、finallyがあって、exceptは例外発生時に、elseは例外の発生しなかった時に、finallyは例外が発生してもしなくても、実行されます。このあいだからデータベースの処理をやってますけど、例外の発生するかも知れないSQLの実行をtryで包んで、例外が出たら処理を確定(commit)せずにデータベースを閉じて、例外をraiseする、例外が出なかったら処理を確定してデータベースを閉じる、みたいにしてやればいいんですね。わかればすごく簡単なことだ。

ただし、SQLがSELECT文みたいなものだと、commitする必要はないので、例外が発生してもしなくても閉じてやればいい。そういう時にはfinallyを使うと。簡単に書いてみるとこんな感じ?

# SELECT文の場合
try:
    cursor.execute('select * from table where id=?;', \
        (id,))
    result = cursor.fetchall()
except:
    raise
finally:
    cursor.close()
    connection.close()

# DELETE文の場合
try:
    cursor.execute('delete from table where id=?;', \
        (iid,))
except:
    cursor.close()
    connection.close()
    raise
else:
    cursor.close()
    connection.commit()
    connection.close()

もちろん、条件によって処理は違ってくるんだけど、おおむねこんな感じになるんだろうと思います。それで、場合によってはwithステートメント(2.5以降)を使うんでしょうけど、私はこれがいまいちわかってないので、まだ試したことがありません。チュートリアルにも書いてあるんですけどね。