Когда я вызываю какие-либо исключения внутри менеджера контекста, код очистки не запускается. Например:
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
Обратите внимание, что оператор try/except правильно перехватывает исключение, а оператор with — нет. Есть ли что-то, чего я не понимаю в том, как должны работать операторы with?
Вы можете увидеть код в скрипке здесь: http://pythonfiddle.com/context-manager-failing а>
К вашему сведению, я использую python 2.7 на OSX Mavericks. Хотя мне удавалось размножаться во многих средах, поэтому я сомневаюсь, что это имеет к этому какое-то отношение.
contextmanager
. Весь последний абзац точно описывает, как это работает, рассказывает, как использоватьtry/
except` илиtry
/finally
и т. д. - person abarnert   schedule 22.11.2014