Вопросы по теме «Исключения и отладка»
try/except, raise, типы исключений, отладка с pdb — на собеседовании спрашивают, как обрабатывать ошибки и что происходит при необработанном исключении. Просят объяснить разницу между ValueError и TypeError, показать try/except/finally. Грамотная обработка ошибок отличает продакшн-код от скрипта в Jupyter.
Всего в этом разделе 20 вопросов. Каждый — с правильным ответом и кратким разбором теории. Разбито на 4 части по 5 вопросов.
Вопросы 1–5 из 20
1Вы читаете сумму из CSV как строку `value = '3.14'` и пытаетесь сделать `int(value)`. Что произойдёт?
AБудет выброшен `ValueError`, потому что строка не является корректным целым числом.
BБудет выброшен `TypeError`, потому что `int(...)` не умеет принимать строки.
CВернётся число 3.14 типа `float`.
DВернётся число 3 типа `int` без ошибок.
Ответ: `ValueError` часто означает: тип входа подходит, но значение нельзя преобразовать/интерпретировать.
Здесь тип аргумента для `int(...)` допустим (строка), но само значение не соответствует формату целого числа. Это типичный `ValueError`. В отладке это сигнал проверить формат данных и решить, что делать: парсить как `float`, округлять по правилам бизнеса или валидировать вход и поднимать `raise`.
2В отчёте вы считаете сумму и случайно складываете число и строку: `total + "10"`. Какое исключение наиболее вероятно?
A`ValueError`
B`KeyError`
C`TypeError`
D`IndexError`
Ответ: `TypeError` возникает, когда операция применяется к несовместимым типам.
При отладке важно отличать проблемы типа от проблем значения. Если переменная имеет «не тот тип» (например, строка вместо числа), то попытка выполнить арифметику часто приводит к `TypeError`. Это подсказка: проверьте, откуда пришло значение и не пропущен ли каст или парсинг.
3Вы парсите событие в словарь `event`. Что произойдёт при обращении `event["currency"]`, если ключа `currency` в словаре нет?
AБудет выброшен `ValueError`.
BБудет выброшен `KeyError`.
CБудет выброшен `TypeError`.
DБудет выброшен `IndexError`.
Ответ: `KeyError` возникает при обращении к отсутствующему ключу словаря через `dict[key]`.
Если ключ может отсутствовать «по данным» (это ожидаемо), лучше использовать `event.get('currency')` или проверку `if 'currency' in event:`. А если ключ обязан быть, то `KeyError` — полезный сигнал о нарушении контракта данных, и его стоит не скрывать, а быстро диагностировать.
4Скрипт получает список строк, но иногда он короче ожидаемого. Что произойдёт при обращении `rows[3]`, если в списке всего 3 элемента?
AБудет выброшен `KeyError`.
BБудет выброшен `TypeError`.
CБудет выброшен `ValueError`.
DБудет выброшен `IndexError`.
Ответ: `IndexError` возникает при обращении к несуществующему индексу списка.
Если индекс выходит за границы списка, Python выбрасывает `IndexError`. В реальной отладке это часто означает, что входные данные могут быть пустыми или короче ожидаемого формата. Нужно проверить, как формируется список, и добавить явную обработку пустого/короткого случая.
5В обработчике данных вы используете конструкцию `try`/`except`/`finally`. Внутри `try` происходит ошибка, она поймана в `except`. Что произойдёт с кодом в `finally`?
AКод в `finally` выполнится в любом случае (и при ошибке, и без неё).
BКод в `finally` выполнится только если в `try` не было ошибок.
CКод в `finally` выполнится только если ошибка НЕ была поймана в `except`.
DКод в `finally` не выполнится, если сработал `except`.
Ответ: Блок `finally` выполняется в любом случае: это место для гарантированного освобождения ресурсов.
`finally` используют для действий, которые должны произойти независимо от исхода: закрыть файл, соединение, вернуть ресурсы. Даже если исключение возникло и было поймано в `except`, блок `finally` всё равно выполнится. Это ключевой инструмент для надежного кода и предсказуемой отладки.
Хотите тренировать интерактивно?
В приложении — таймер, прогресс, стрики и 1700+ вопросов по всем темам.
Тренировать в Telegram