Найти тему
Computer Pro

Модуль 5. Задача 3. Заглушка исключений

Оглавление
Реализуйте контекстный менеджер, который будет игнорировать переданные типы исключений, возникающие внутри блока with. Если выкидывается "не ожидаемый" тип исключения, то он прокидывается (слово мне это мало знакомо, что оно в реале значит, можно лишь предполагать) выше.
Терпеть не могу непонятные формулировки.

Внезапно, ответ, на "прокинуть", нашелся в англо-русском переводчике:

это означает "пропустить"
это означает "пропустить"

Далее по задаче идет несколько примеров выполнения кода, и какие-то другие объяснения, но мне стало ясно, что ничего не ясно...

Чтобы определить, является ли вызванное исключение дочерним по отношению к переданным классам ошибок, воспользуйтесь функцией issubclass. Вторым аргументом она может принимать кортеж классов.

Прилагается шаблон программы из которой нужно реализовать этот "контекстный менеджер":

-2

А раз задача мне толком не понятна, то пойду почитаю чат в "телеге", попытаюсь понять что другие люди поняли о задаче, которую предстоит выполнить...

Да, что-то я там нашел, немногим ясней стала цель работы. Я совершенно забыл как толком работает контекстный менеджер with... Изучал я это более полутора лет назад и осталось только образное представление о том как это работает.

Немного теории о создании контекстных менеджеров:
Чтобы создать свой контекстный менеджер в Python, вам необходимо определить класс, который содержит методы __enter__() и __exit__().
Метод __enter__ вызывается при входе в контекстный блок (после оператора with). В данном случае, он открывает файл и возвращает его. Это значение можно использовать внутри контекстного блока, как показано выше.
Метод __exit__ вызывается при выходе из контекстного блока, не зависимо от того, произошла ли ошибка или нет. Он обычно используется для освобождения ресурсов или закрытия файлов. В данном случае, он закрывает файл.
Важно отметить, что метод __exit__ принимает три аргумента: type, value и traceback. Эти аргументы используются для обработки исключений, возникающих внутри контекстного блока. Если внутри блока with произошло исключение, Python передает его тип, значение и след (объект traceback) в метод __exit__. Это позволяет обрабатывать исключения прямо внутри метода __exit__.
В общем, методы __enter__ и __exit__ позволяют управлять ресурсами более эффективно и безопасно, минимизируя вероятность утечек ресурсов и обеспечивая корректное завершение операций, даже в случае возникновения исключений..
Как выглядит контекстный менеджер по записи в файл Hello, world!
Как выглядит контекстный менеджер по записи в файл Hello, world!

Повторили теорию, приступим к практике:

Собственно сам контекстный менеджер написать было не трудно, тут кода почти нет, верней, в шаблоне не много изменилось:

-4

В метод __init__ передаются те ошибки которые нужно игнорировать, __enter__ остается без изменений а в __exit__ добавляем проверку является ли исключение дочерним по отношению к базовому классу BaseException.

-5

Ну теперь осталось написать тесты для данного контекстного менеджера. И тут я попал в ступор, я не понял, для каких ситуаций нужно писать тесты. Какой то хитрый программер написал вот такие условия для тестов:

  • Ошибка игнорируется.
  • Ошибка прокидывается выше.
  • Ошибка прокидывается выше во внутреннем блоке и игнорируется во внешнем.
  • Дочерние ошибки игнорируются.

Вроде бы на русском языке написано а что делать - я так и не понял.

Признаюсь честно, я скопировал тесты с гитхаб Мирона Аносова. Не все конечно, но добрую половину. Ибо надо отправлять работу на проверку, а я сижу и занимаюсь прокрастинацией...

-6
-7

То что я тему тестов плохо понимаю - это факт! Но как правило все темы со временем начинают в голове складываться в общую картину и как по щелчку пальцев становится всё понятно. В общем отправлю это задание как есть, и посмотрим что скажет куратор.

По принятии работы - отпишусь в комментариях.