Исключения, возникающие во время выполнения этого метода, заменят все исключения, возникшие в теле оператора with.
https://docs.python.org/3/library/stdtypes.html#contextmanager. exit
И мы могли бы увидеть с заявлением для более подробной информации. Независимо от того, выбрасывает ли SUITE исключение или нет, исключение, вызванное __exit__
, всегда выбрасывается вызывающей стороне.
with EXPRESSION as TARGET:
SUITE
семантически эквивалентно:
manager = (EXPRESSION)
enter = type(manager).__enter__
exit = type(manager).__exit__
value = enter(manager)
hit_except = False
try:
TARGET = value
SUITE
except:
hit_except = True
if not exit(manager, *sys.exc_info()):
raise
finally:
if not hit_except:
exit(manager, None, None, None)