В коде есть два обработчика: except ValueError: и except Exception:. Почему порядок этих блоков except важен?
AПорядок обработчиков
except не важен: интерпретатор Python всё равно выберет самый подходящий блок по типу исключения.BБолее специфичные исключения (например,
ValueError) должны идти раньше, иначе их перехватит более общий блок except Exception:.CБлок
except Exception: всегда должен идти первым, чтобы «ускорить» обработку и сразу ловить любые ошибки в одном месте.DПорядок блоков
except зависит только от версии Python и не имеет реального значения для логики обработки ошибок в коде.Правильный ответ. Сначала пишут специфичные
except, потом более общие, иначе логика обработки ломается.Разбор
Python проверяет блоки except сверху вниз. Если поставить except Exception: раньше, он перехватит почти всё и до except ValueError: дело не дойдёт. Это ухудшает диагностику и приводит к неправильной обработке ошибок: смысл точечных блоков except теряется, потому что они становятся недостижимы.
Проверь себя · 1/3разбор после ответа
Вы пишете функцию, которая внутри
try делает return, а в finally закрывает ресурс (например, файл или соединение). Что произойдёт с кодом в finally при return из try?Ещё вопросы по теме «Исключения и отладка»
- В обработчике данных используется конструкция `try`/`except`/`finally`. Внутри `try` произошла ошибка, она поймана в `except`. Что произойдёт с кодом в блоке `finally`?
- Вы парсите событие в словарь `event`. Что произойдёт при обращении `event['currency']`, если ключа `currency` в словаре нет?
- В отчёте вы считаете сумму и случайно складываете число и строку: `total + "10"`. Какое исключение наиболее вероятно?
- Скрипт получает список строк, но иногда он короче ожидаемого. Что произойдёт при обращении `rows[3]`, если в списке всего 3 элемента?
- Вы пишете функцию, которая внутри `try` делает `return`, а в `finally` закрывает ресурс (например, файл или соединение). Что произойдёт с кодом в `finally` при `return` из `try`?
- Все вопросы по «Исключения и отладка» →