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