August 8, 2024

Элегантное подавление исключений с contextlib.suppress

Бывает так, что какой-либо метод при работе программы выдает исключение, но нам не надо его обрабатывать каким-нибудь хитрым образом, а достаточно лишь подавить исключение и идти дальше.

Это можно сделать с помощью классического try-except, но есть и более элегантный способ. Когда это может пригодиться и как пользоваться? Об этом и поговорим в статье.

Зачем подавлять исключения?


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

Конкретный пример:

Допустим, вы пишете автотест, и после создания некоторой сущности и выполнения манипуляций с ней, вам надо эту сущность удалить.

Все отрабатывает корректно, вот только запрос на удаление зависает в статусе pending и ответ не приходит, вызывается исключение по таймауту, но при этом сущность удаляется.

Зная все это, мы можем временно подавить исключение до решения проблемы с запросом и пустить тест в работу.

Как это сделать?


Рассмотрим 2 способа: канонический try-except и contextlib.suppress

Классический способ

try:
    requests.delete(url=https://example.com/users/user1)
except requests.TimeoutException:
    pass

contextlib.suppress

Синтаксис

contextlib.suppress(*exceptions)

Пример:

from contextlib import suppress

with suppress(requests.TimeoutException):
    requests.delete(url=https://example.com/users/user1)

suppress возвращает контекстный менеджер, который подавляет переданные исключения, если они встречаются в теле выражения with.

Данный контекстный менеджер предлагает нам удобный способ работы с исключениями. Но не стоит забывать, что suppress cледует использовать только в специфических случаях.