@RuslanBay02

Класс как контекст-менеджер. Методы enter и exit. Как решить задачу полностью?

Добрый день. Помогите с решением задачи

Задача 2. Пример

На одном собеседовании вам дали такой основной код:

my_obj = Example()
with my_obj as obj:
    print('Код внутри первого вызова контекст менеджера')
    with my_obj as obj2:
        raise Exception('Выброс исключения во вложенном (втором) вызове контекст менеджере')
    print('Я обязательно выведусь...')


Также вместе с этим кодом выдали результат его выполнения:

Вызов __init__

Вызов __enter__

Код внутри первого вызова контекст менеджера

Вызов __enter__

Вызов __exit__

Тип ошибки:

Значение ошибки: Выброс исключения во вложенном (втором) вызове контекст-менеджера

"След" ошибки:

Вызов __exit__

Тип ошибки:

Значение ошибки: Выброс исключения во вложенном (втором) вызове контекст-менеджера

"След" ошибки:

. . . . (тут сама ошибка красным цветом) . . . .

Исходя их этих входных данных, реализуйте класс «Контекст-менеджер», который будет выдавать такой же результат.

После этого поправьте класс так, чтобы сработала последняя строчка основного кода. Сам основной код редактировать нельзя.

Результат с последней строчкой:

Вызов __init__

Вызов __enter__

Код внутри первого вызова контекст-менеджера

Вызов __enter__

Вызов __exit__

Тип ошибки:

Значение ошибки: Выброс исключения во вложенном (втором) вызове контекст-менеджера

"След" ошибки:

Я обязательно выведусь...

Вызов __exit__


Вот мой код:


class Example:

	def __init__(self):
		print('Вызов __init__')

	def __enter__(self) -> 'Example':
		print('Вызов __enter__')
		return self

	def __exit__(self, exc_type, exc_val, exc_tb):
		print('Вызов __exit__')
		if Exception:
			print('Тип ошибки: ', exc_type)
			print('Значение ошибки: ', exc_val)
			print('"След" ошибки: ', exc_tb)
		else:
			return True

my_obj = Example()

with my_obj as obj:
	print('Код внутри первого вызова контекст менеджера')
	with my_obj as obj2:
		raise Exception('Выброс исключения во вложенном (втором) вызове контекст менеджере')
	print('Я обязательно выведусь...')


Не могу выполнить последнюю строчку!
  • Вопрос задан
  • 535 просмотров
Пригласить эксперта
Ответы на вопрос 1
Надо не много поправить __exit__ первое проверку типа ошибки, и второе "подавление ошибки"

class Example:

    def __init__(self):
        print('Вызов __init__')

    def __enter__(self) -> 'Example':
        print('Вызов __enter__')
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('Вызов __exit__')
        if exc_type is not None and issubclass(exc_type, Exception):
            print('Тип ошибки: ', exc_type)
            print('Значение ошибки: ', exc_val)
            print('"След" ошибки: ', exc_tb)
        return True


my_obj = Example()

with my_obj as obj:
    print('Код внутри первого вызова контекст менеджера')
    with my_obj as obj2:
        raise Exception('Выброс исключения во вложенном (втором) вызове контекст менеджере')
    print('Я обязательно выведусь...')
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы