Как-то очень вскользь сказано про обработку исключений. Хотя это, в сущности, первое, для чего были изначально предназначены контекстные менеджеры - удобная обертка над try ... finally.
Суть контекстного менеджера в том, что в констукции withгарантируется, что если метод __enter__() был выполнен без ошибок, то метод __exit__() будет вызван всегда. Закрытие файлов, соединений и т. п. финализирующие операции - это только примеры того, что может потребоваться сделать при выходе контекста. А выходим мы из контекста либо после выполнения всех операци в блоке with. Тогда в качестве параметров в метод __exit__ передаетя три значения None. Либо если в блоке with возникает необработанное исключение. Тогда в __exit__ попадает информмация об этом исключении в виде 3 параметров, которые представляют собой ничто иное как кортеж значений, возвращаемых функцией sys.exc_info(), будучи вызванной внутри блока finally.
Внутри __exit__ исключение можно обработать или передать выше. Если __exit__ возвращает любое истинное значение, тогда исключение считается обработанным, и выполнение кода продолжается с места выхода из контекстного менеджера. Если __exit__ возвращает ложное значение, например None, то при выходе из метода исключение будет обрабатываться обычным образом. При этом стоит помнить, что новые исключения, возникшие в ходе выполнения метода __exit__, всегда замещают исключения, которые могли возникнуть в ходе выполнения тела with и попали в параметры метода __exit__.
Стоило дочитать до конца, чтобы снизить уровень возмущения, копившегося с первых строк.
Мало что раздражает так же сильно, как бессмысленное требование "безопасности" пароля. Особенно когда речь о каком-нибудь мелком форуме, требующем регистрацию для просмотра ссылок или вложений.
Как-то очень вскользь сказано про обработку исключений. Хотя это, в сущности, первое, для чего были изначально предназначены контекстные менеджеры - удобная обертка над
try ... finally
.Суть контекстного менеджера в том, что в констукции
with
гарантируется, что если метод__enter__()
был выполнен без ошибок, то метод__exit__()
будет вызван всегда. Закрытие файлов, соединений и т. п. финализирующие операции - это только примеры того, что может потребоваться сделать при выходе контекста. А выходим мы из контекста либо после выполнения всех операци в блокеwith
. Тогда в качестве параметров в метод__exit__
передаетя три значенияNone
. Либо если в блокеwith
возникает необработанное исключение. Тогда в__exit__
попадает информмация об этом исключении в виде 3 параметров, которые представляют собой ничто иное как кортеж значений, возвращаемых функцией sys.exc_info(), будучи вызванной внутри блокаfinally
.Внутри
__exit__
исключение можно обработать или передать выше. Если__exit__
возвращает любое истинное значение, тогда исключение считается обработанным, и выполнение кода продолжается с места выхода из контекстного менеджера. Если__exit__
возвращает ложное значение, напримерNone
, то при выходе из метода исключение будет обрабатываться обычным образом. При этом стоит помнить, что новые исключения, возникшие в ходе выполнения метода__exit__
, всегда замещают исключения, которые могли возникнуть в ходе выполнения телаwith
и попали в параметры метода__exit__
.Стоило дочитать до конца, чтобы снизить уровень возмущения, копившегося с первых строк.
Мало что раздражает так же сильно, как бессмысленное требование "безопасности" пароля. Особенно когда речь о каком-нибудь мелком форуме, требующем регистрацию для просмотра ссылок или вложений.