コンテキスト マネージャー内で例外を発生させると、クリーンアップ コードが実行されません。例えば:
from contextlib import contextmanager
try:
raise BaseException()
except BaseException:
print "bye from except"
@contextmanager
def say_goodbye():
yield
print "bye from context manager"
with say_goodbye():
raise BaseException()
出力します:
bye from except
Traceback (most recent call last):
File "", line 15, in
BaseException
with ステートメントは例外をキャッチしませんが、try/except は適切に例外をキャッチすることに注意してください。with ステートメントがどのように機能するかについて、私が理解できないことはありますか?
ここでコードをフィドルで見ることができます: http://pythonfiddle.com/context-manager-failing
参考までに、OSX mavericks で python 2.7 を実行しています。私は多くの環境で再現できましたが、それが関係しているとは思えません。