Вызывается ли метод __exit__ при наличии исключения внутри менеджера контекста?

Представьте, что у нас есть контекстный менеджер с именем abc. Итак, в приведенном ниже коде метод __exit__, определенный внутри abc, вызывается, если есть исключение.

with abc:
    print("entered context manager")
    raise Exception("raising exception")



person Murali K    schedule 29.05.2020    source источник


Ответы (1)


Да, согласно документации. Метод __exit__ получает исключение в качестве аргументов:

object.__exit__(self, exc_type, exc_value, traceback)

Выйти из контекста выполнения, связанного с этим объектом. Параметры описывают исключение, вызвавшее выход из контекста. Если контекст был закрыт без исключения, все три аргумента будут равны None.

На этот вопрос есть гораздо больше ответов и информации.

Это был первый результат в Google, когда я набрал python __exit__ exception.

person Ralf    schedule 29.05.2020
comment
Мой контекстный менеджер из библиотеки, которую я установил, я попытался добавить операторы печати в исходный код, чтобы проверить, вызывается ли __exit__, и я не видел, чтобы какой-либо из них выполнялся в терминале... ну, он не появился для __enter__ as хорошо. Я что-то упускаю? почему мои операторы печати внутри исходного кода не выполняются? - person Murali K; 29.05.2020