Я знаю, что повторно вызывать исключение из метода __exit__()
контекстного менеджера — плохой стиль. Итак, я хотел бы добавить атрибут к экземпляру, который может нести контекстную информацию, которая недоступна, если я позволю исключению просочиться или поймаю его. Это позволит избежать повторного повышения.
Альтернативой привязыванию атрибута к исключению было бы проглатывание исключения, установка некоторого состояния экземпляра, который удваивается как рассматриваемый менеджер контекста, а затем проверка этого состояния. Проблема в том, что это приведет к уловке 22, не так ли? Поскольку исключение означает, что выполнение внутри блока with
завершается. Нет другого способа повторить операцию, кроме как снова войти в блок with
, верно? Таким образом, экземпляр, в котором я пытаюсь сохранить контекстную информацию, исчезнет после возврата метода __exit__()
.
Итак, вкратце: как я могу манипулировать фактическим ожидающим исключением (если оно есть, что я буду считать заданным для этого вопроса), находясь в методе __exit__()
?
None
гарантирует сохранение состояния исключения), но вы можете вызвать новое исключение. - person Martijn Pieters   schedule 13.11.2014