3

コンテキスト マネージャー内で例外を発生させると、クリーンアップ コードが実行されません。例えば:

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 を実行しています。私は多くの環境で再現できましたが、それが関係しているとは思えません。

4

1 に答える 1