あまり見かけない例外

以下のコードを windowspython 2.5 で実行すると、

def foo():
    try:
        print 2
        break
    finally:
        print 3
    print 4

if __name__ == '__main__':
    print 1
    foo()
    print 5

こうなる。

1
2
3
Traceback (most recent call last):
  File "C:\test.py", line 11, in 
    foo()
SystemError: error return without exception set

SystemErrorはあまり聞いたことがない。「例外がセットされずにエラーが返った」という説明を読んでもピンと来ない。というか、そもそもtry ~ finallyの中でbreakは使用できるのかという疑問が頭を過ぎる。

マニュアルを引くと少しだけ記述がある。

try...finally 文の try スイート内で return、 break、または continue 文が実行された場合、finally 節も `抜け出る途中に (on the way out)' 実行されます。

http://www.python.jp/doc/2.4/ref/try.html

うむ当たり前だな。そもそもbreakって何をするものだったっけ?これもマニュアルにある。

break 文は、文を囲う最も内側のループを終了させ、ループにオプションの else 節がある場合には else 節に飛びます。

http://www.python.jp/doc/2.4/ref/break.html

なるほど。さらに引用。

break が finally 節を伴う try 文の外側に処理を渡す際には、ループを実際に抜ける前にそのfinally 節が実行されます。

そうか、よく分かった。で、何でSystemErrorが発生したんだ?