Что выведет код Middle Исключения и контекстные менеджеры обновлено
Контекстный менеджер подавляет ошибку
Вопрос
Что выведет код? По строке на каждый print.
class Guard:
def __enter__(self):
print('enter')
return 'res'
def __exit__(self, et, e, tb):
print('exit', et.__name__ if et else None)
return et is KeyError
with Guard() as r:
print(r)
{}['x']
print('after 1')
try:
with Guard():
raise ValueError
except ValueError:
print('caught')
Попробуйте сами
Напишите, что выведет код: каждый вывод с новой строки.
Показать ответ и разбор
Коротко
Код выведет: enter, res, exit KeyError, after 1, enter, exit ValueError, caught. as получает результат enter.
Что выведет
enter
res
exit KeyError
after 1
enter
exit ValueError
caught
Разбор
as получает результат __enter__. KeyError внутри with передаётся в __exit__, тот возвращает True, и исключение подавлено: выполнение идёт дальше. Для ValueError __exit__ возвращает False, исключение уходит наружу и ловится внешним try.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.