Ответ вслух Middle Исключения и контекстные менеджеры спрашивают часто обновлено

Как вы обрабатываете ошибки в Python-сервисе

Вопрос

Расскажите, как вы строите обработку ошибок в Python-сервисе: что ловите, что пробрасываете, как логируете.

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Образцовый ответ: «Главный принцип: ловить исключение там, где я знаю, что с ним делать, и ловить конкретный тип. Например, KeyError при разборе ответа превращаю в понятную ошибку валидации.

Что должно прозвучать в ответе

  • Ловить конкретные исключения как можно ближе к месту, где знаешь, что делать

  • Своя иерархия исключений домена, базовый класс модуля

  • `raise ... from e` при переводе ошибок между слоями

  • Не глотать молча: логирование с traceback (`logger.exception`)

  • Глобальный обработчик на границе: HTTP 500, алерт

  • Ресурсы через `with`, ретраи только для временных ошибок

Что могут спросить следом

  • Когда допустим except Exception?
  • Как различать ошибки клиента и ошибки сервера?
  • Что такое ExceptionGroup и где он появляется?

Разбор

Образцовый ответ: «Главный принцип: ловить исключение там, где я знаю, что с ним делать, и ловить конкретный тип. Например, KeyError при разборе ответа превращаю в понятную ошибку валидации. Для домена завожу иерархию: базовое BillingError и наследники CardDeclined, ProviderUnavailable, чтобы верхний слой мог ловить и всё сразу, и точечно. При переходе между слоями оборачиваю низкоуровневые ошибки: raise ProviderUnavailable(...) from e, так в логе видна причина. Молча не глотаю ничего: если ловлю широко, то логирую через logger.exception, он пишет traceback. except Exception допустим на границе: в обработчике HTTP-запроса или воркера очереди, где нужно превратить любую ошибку в 500 или ретрай и не уронить процесс; это обычно делает middleware фреймворка. Ошибки клиента (400, 404) отделяю типами от ошибок сервера. Ресурсы держу в with, а ретраи ставлю только на временные ошибки: таймауты, 503, и с ограничением попыток».

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.