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