---
title: Исключения в Python
questionDates:
  q-transfer-0137: '2026-10-01'
  q-transfer-0138: '2026-10-01'
  q-transfer-0139: '2026-10-01'
  q-transfer-0239: '2026-10-01'
  q-transfer-0272: '2026-10-01'
seo:
  description: >-
    Тема «Исключения в Python» для собеседования Python Developer. Как
    обрабатывать исключения и не скрывать ошибки? Когда выполняется finally и
    чем опасен return внутри него?
  title: Исключения в Python — Python Developer
---

[Все темы Python Developer](/prep/python-developer)

## Как обрабатывать исключения и не скрывать ошибки? [#q-transfer-0137]

Перехватывают только ожидаемые типы ошибок и ограничивают `try` операцией, которая действительно может упасть. В `except` добавляют контекст, который поможет найти входные данные и этап сбоя, но не логируют секреты. Если слой не умеет восстановиться, ошибку поднимают дальше через `raise`; при преобразовании используют `raise DomainError(...) from exc`. Голый `except: pass` скрывает и программные ошибки, и сигналы завершения. Границу обработки выбирают там, где слой способен восстановиться, добавить полезный контекст или перевести сбой в доменную ошибку.

:::note[Ссылки для изучения]

1. [Обрабатывать ожидаемые ошибки, повторно raise и сохранять причину — Python](https://docs.python.org/ru/3/tutorial/errors.html#handling-exceptions)
2. [Иерархия исключений и порядок except. selfedu, с 10:27](https://www.youtube.com/watch?v=MFIlltaeIgs&t=627s)

:::

---

## Когда выполняется finally и чем опасен return внутри него? [#q-transfer-0138]

`finally` выполняется при обычном выходе, `return`, `break` и распространении исключения. Его используют для освобождения ресурса, если контекстный менеджер не подходит. `return` внутри `finally` опасен: он заменяет ранее вычисленный результат и подавляет летящее исключение. Гарантия не абсолютна для аварийного завершения процесса, `os._exit()` или отключения питания. Границу обработки выбирают там, где слой способен восстановиться, добавить полезный контекст или перевести сбой в доменную ошибку.

:::note[Ссылки для изучения]

1. [Выполнение finally и подавление результата или исключения через return — Python](https://docs.python.org/ru/3/tutorial/errors.html#defining-clean-up-actions)
   :::

---

## Как и когда создавать собственные исключения? [#q-transfer-0139]

Собственное исключение нужно, когда вызывающему коду полезно отличать доменную ошибку от технической. Класс обычно наследуют от `Exception`, дают ему конкретное имя и при необходимости поля с машинно читаемым контекстом. Родственные ошибки объединяют базовым классом. При переводе низкоуровневой причины в доменную сохраняют цепочку: `raise PaymentError(...) from exc`. Сообщение должно объяснять сбой, но не раскрывать секреты. Границу обработки выбирают там, где слой способен восстановиться, добавить полезный контекст или перевести сбой в доменную ошибку.

:::note[Ссылки для изучения]

1. [Собственные классы исключений, атрибуты ошибки и сохранение причины — Python](https://docs.python.org/ru/3/tutorial/errors.html#user-defined-exceptions)
   :::

---

## Когда использовать assert, а когда raise? [#q-transfer-0239]

`assert` выражает внутренний инвариант разработчика и помогает заметить невозможное состояние. При запуске Python с оптимизацией assertions могут быть удалены, поэтому ими нельзя проверять пользовательский ввод, права, платеж или обязательное предусловие API. Для таких случаев явно поднимают подходящее исключение. Assertion также не должен иметь нужного программе побочного эффекта, иначе поведение изменится под `-O`. Границу обработки выбирают там, где слой способен восстановиться, добавить полезный контекст или перевести сбой в доменную ошибку.

:::note[Ссылки для изучения]

1. [assert как отладочная проверка: почему она исчезает при оптимизации — Python](https://docs.python.org/ru/3/reference/simple_stmts.html#the-assert-statement)
   :::

---

## Чем исключение отличается от синтаксической ошибки? [#q-transfer-0272]

Синтаксическая ошибка возникает при разборе исходного кода до выполнения соответствующего модуля; обычный `try` внутри этого неразобранного кода ее не перехватит. Исключение возникает во время исполнения и может быть обработано подходящим `except`. Некоторые `SyntaxError` можно поймать вокруг динамического `compile` или импорта. Восстанавливаться стоит только там, где понятен корректный следующий шаг. Границу обработки выбирают там, где слой способен восстановиться, добавить полезный контекст или перевести сбой в доменную ошибку.

:::note[Ссылки для изучения]

1. [Ошибка разбора кода и исключение при выполнении — официальный учебник Python](https://docs.python.org/ru/3/tutorial/errors.html#syntax-errors)
   :::
