try-excepttry-finally を1つの try にできない

プログラムの中で例外が発生すると、通常それ以降のコードは呼ばれません。 それだと困る場合があるので、例外を処理するために try 文という仕組みが用意されています。 実際のコードの中では tryexcept (または tryfinally) を組み合わせて使います。

except 節は例外が発生したときにだけ呼ばれます。

while True:
    try:
        x = int(raw_input("Please enter a number: "))
        break
    except ValueError:
        print "Not a valid number.  Try again..."

finally 節は例外が発生してもしなくても常に呼ばれます。

f = open("input.txt")
try:
    n = 0
    for line in f:
        n += int(line)
    print n
finally:
    f.close()

Python 2.4 では、同じ tryexceptfinally を 両方指定することができないという制限があります。 そのため以下のような書き方は構文エラーになります。

f = open(path, 'r')
try:
    f.write('test')
except IOError, (errno, msg):
    print 'Cannot write to %s: %s' % (path, msg)
finally:
    f.close()

代わりに以下のように try を入れ子にします。

f = open(path, 'w')
try:
    try:
        f.write('test')
    except IOError, (errno, msg):
        print 'Cannot write to %s: %s' % (path, msg)
finally:
    f.close()

別にどうってことはないのですが、インデントが深くなって行数が増えた分、 ソースコードがちょっとごちゃごちゃして読みにくくなってしまいました。

Python 2.5 以降にはそんな制限はありません。