Блог
Python

Работа с исключениями в Python: что спрашивают на собеседовании

Работа с исключениями — обязательная тема для любого собеседования по Python, независимо от грейда: без обработки ошибок код падает при первой же непредвиденной ситуации, а грамотная обработка исключений — признак того, что вы пишете код для реальных условий, а не только для идеального сценария.

try/except: базовый механизм

def divide(a, b):
try:
return a / b
except ZeroDivisionError:
print('Деление на ноль недопустимо')
return None

print(divide(10, 2)) # 5.0
print(divide(10, 0)) # Деление на ноль недопустимо -> None

Код внутри try выполняется как обычно, пока не возникнет ошибка. Если возникает исключение указанного типа (ZeroDivisionError), выполнение прерывается и управление передаётся в блок except — программа не падает целиком, а обрабатывает ситуацию контролируемо.

Несколько типов исключений

def process(value):
try:
number = int(value)
return 100 / number
except ValueError:
print('Не удалось преобразовать в число')
except ZeroDivisionError:
print('Деление на ноль')

process('abc') # Не удалось преобразовать в число
process('0') # Деление на ноль
process('5') # вернёт 20.0

Можно перехватывать разные типы ошибок отдельными блоками except — это позволяет реагировать на конкретную проблему конкретным образом, а не обрабатывать все ошибки одинаково. Важное правило хорошего стиля: перехватывать конкретные типы исключений (ValueError, ZeroDivisionError), а не голый except: без указания типа — иначе можно случайно проглотить и системные ошибки, которые на самом деле нужно было увидеть и исправить, а не скрыть.

else и finally

def read_config(path):
try:
with open(path) as f:
data = f.read()
except FileNotFoundError:
print('Файл не найден')
return None
else:
print('Файл успешно прочитан')
return data
finally:
print('Попытка чтения завершена')

read_config('missing.txt')
# Файл не найден
# Попытка чтения завершена

else выполняется, только если блок try завершился без исключений — логически он отделяет «код, который может упасть» от «кода, который выполняется только при успехе». finally выполняется всегда, независимо от того, было исключение или нет, — это место для кода, который обязан отработать в любом случае: закрыть файл, освободить ресурс, залогировать завершение операции.

Собственные исключения

class InsufficientFundsError(Exception):
def __init__(self, balance, amount):
self.balance = balance
self.amount = amount
super().__init__(f'Недостаточно средств: баланс {balance}, нужно {amount}')

def withdraw(balance, amount):
if amount > balance:
raise InsufficientFundsError(balance, amount)
return balance - amount

try:
withdraw(100, 500)
except InsufficientFundsError as e:
print(e) # Недостаточно средств: баланс 100, нужно 500

Собственные исключения создаются наследованием от Exception (или от более конкретного встроенного класса ошибок). Это позволяет описывать бизнес-логику ошибок явно — InsufficientFundsError понятнее и информативнее, чем общий ValueError с текстовым сообщением, и позволяет коду, который вызывает функцию, реагировать именно на эту конкретную ситуацию через except InsufficientFundsError.

Частые вопросы про исключения в Python

В чём разница между except и else в try/except? except выполняется, если в блоке try произошла ошибка указанного типа. else выполняется, только если ошибок не было вообще — это способ явно отделить «код на случай успеха» от основной логики, которая может упасть.
Когда выполняется finally? Всегда — независимо от того, было исключение, было ли оно перехвачено, или код в try отработал без ошибок. Используется для кода, который обязан выполниться в любом случае: закрытие файлов, освобождение ресурсов, логирование.
Почему плохо писать голый except: без указания типа ошибки? Такой блок перехватывает вообще любое исключение, включая те, которые на самом деле нужно было увидеть и исправить (например, опечатку в имени переменной, которая вызывает NameError). Это маскирует реальные баги вместо их обработки.
Зачем создавать собственные классы исключений? Чтобы явно описывать бизнес-логику ошибок и давать коду, вызывающему функцию, возможность реагировать именно на конкретную ситуацию (except InsufficientFundsError), а не разбирать текст сообщения общей ошибки вручную.

Закрепить работу с исключениями на практике

Написать собственный класс исключения и увидеть разницу с голым except — задача, которую стоит один раз сделать руками. Потренироваться можно на тренажёре Python Arena от Quality Academy — 1339 задач, AI-ментор разбирает ошибки в коде.

-------

Полезные ссылки школы

Сайт Quality Academy:
https://quality-academy.ru/main
Telegram-канал:
https://t.me/quality_academy
YouTube-канал:
https://www.youtube.com/@quality_academy
ВКонтакте:
https://vk.com/quality_academy
Канал отзывов учеников (58+ отзывов):
https://t.me/quality_academy_reviews
Задать вопрос менеджеру:
https://t.me/quality_academy_bot
Тест «Подойдёт ли вам тестирование»:
https://quiz.quality-academy.ru
5000+ вопросов с собесов тестировщика — бот-тренажёр:
https://t.me/quality_academy_interview_bot
3 практические задачи и дорожная карта:
https://t.me/quality_academy_tasks_bot
Бесплатные тренажёры — SQL Arena, Playwright Arena, Python Arena:
SQL Arena · Playwright Arena · Python Arena