try/except — одна из самых полезных конструкций в Python, особенно для аналитика. Скрипты часто ломаются не потому, что логика плохая, а потому что реальный мир грязный:
- файл не найден
- колонка отсутствует
- API не ответил
- число оказалось строкой
- в данных пришел
None
Именно для этого нужен try/except.
Базовая идея
try:
# код, который может упасть
except:
# что делать, если ошибка произошла
Но на практике лучше ловить не все подряд, а конкретные ошибки.
Пример 1. Преобразование строки в число
value = "123"
try:
number = int(value)
except ValueError:
number = None
Если в value окажется "abc", код не упадет, а обработает ситуацию.
Пример 2. Чтение файла
import pandas as pd
try:
df = pd.read_csv("sales.csv")
except FileNotFoundError:
print("Файл sales.csv не найден")
Это базовый, но очень жизненный кейс.
Пример 3. Работа с колонкой
try:
avg_price = df["price"].mean()
except KeyError:
print("В таблице нет колонки price")
Если структура файла поменялась, скрипт хотя бы объяснит, что именно случилось.
Пример 4. Работа с API
import requests
try:
response = requests.get("https://api.example.com/data", timeout=10)
response.raise_for_status()
data = response.json()
except requests.exceptions.RequestException as e:
print(f"Ошибка запроса: {e}")
Для аналитика это очень полезно, если ты забираешь данные из внешних сервисов.
Почему не стоит писать просто except
Вот так:
try:
...
except:
print("Ошибка")
технически можно, но это плохая привычка.
Проблема в том, что ты ловишь вообще все:
- ошибки в данных
- ошибки сети
- ошибки логики
- даже неожиданные баги в коде
Из-за этого код становится труднее отлаживать.
Лучше так:
except ValueError:
except FileNotFoundError:
except KeyError:
try/except/else/finally
Есть еще полезные части конструкции:
try:
number = int(value)
except ValueError:
print("Не удалось преобразовать")
else:
print("Преобразование успешно")
finally:
print("Этот блок выполнится в любом случае")
Когда что использовать
except— обработка ошибкиelse— код, если ошибки не былоfinally— код, который должен выполниться всегда
Реальный кейс аналитика: пройти по многим файлам
import pandas as pd
from pathlib import Path
for path in Path("data").glob("*.csv"):
try:
df = pd.read_csv(path)
print(f"{path.name}: ok, строк = {len(df)}")
except Exception as e:
print(f"{path.name}: ошибка -> {e}")
Тут важно одно: если один файл битый, весь процесс не падает.
Частая ошибка №1: скрывать ошибку и ничего не логировать
Плохо:
try:
...
except:
pass
Это очень опасно. Код молча проглатывает ошибку, и ты потом тратишь время на поиск странного поведения.
Лучше хотя бы так:
except Exception as e:
print(e)
Частая ошибка №2: оборачивать слишком большой блок
Плохо:
try:
df = pd.read_csv(path)
df["price"] = df["price"].astype(float)
result = df.groupby("category")["price"].mean()
save_result(result)
except Exception:
print("Что-то пошло не так")
Здесь непонятно, где именно возникла проблема.
Лучше ловить ошибки ближе к конкретным рисковым местам.
Итог
try/except нужен не для того, чтобы “прятать ошибки”, а чтобы управлять ими осознанно.
Для аналитика это особенно важно в задачах:
- чтения файлов
- обработки данных
- работы с API
- автоматизации отчетов
Главное правило:
- лови конкретные исключения
- не проглатывай ошибки молча
- делай обработку понятной для себя и для будущего дебага