Цель: Научиться обрабатывать ошибки и делать программы надёжными.
Почему программы падают?
number = 10 / 0 # ZeroDivisionError: division by zero
Решение: try/except — перехватить ошибку и обработать её.
Базовый синтаксис
try:
result = 10 / 0
except ZeroDivisionError:
print("Нельзя делить на ноль!")
Ловить голый except: (без типа) — плохая практика: скрывает реальные проблемы.
Популярные типы ошибок
# ValueError — неверное значение
try:
age = int("двадцать")
except ValueError:
print("Введите число цифрами!")
# FileNotFoundError — файл не найден
try:
with open("missing.txt") as f:
data = f.read()
except FileNotFoundError:
print("Файл не найден!")
# KeyError — ключ не найден в словаре
try:
age = user["age"]
except KeyError:
print("Ключ 'age' отсутствует!")
# TypeError — несовместимые типы
try:
result = "5" + 10
except TypeError:
print("Несовместимые типы!")
# IndexError — индекс вне диапазона
try:
print([1, 2, 3][10])
except IndexError:
print("Индекс вне диапазона!")
Несколько except + получение деталей
try:
age = int(input("Возраст: "))
result = 100 / age
except ValueError:
print("Введите число!")
except ZeroDivisionError:
print("Возраст не может быть нулём!")
except Exception as e: # поймает всё остальное
print(f"Неожиданная ошибка: {e}")
finally и else
try:
data = json.loads(json_string)
except json.JSONDecodeError as e:
print(f"Невалидный JSON: {e}")
else:
process(data) # выполнится только при успехе
finally:
print("Выполнится всегда") # очистка ресурсов
Когда НЕ нужен try/except
# ❌ Плохо — скрывать баги
try:
hacky_code()
except:
pass
# ❌ Плохо — заменять проверки
try:
if user["age"] > 18: ...
except KeyError:
...
# ✅ Хорошо — проверять заранее
if "age" in user and user["age"] > 18: ...
Когда нужен try/except
# Ввод пользователя
def get_int(prompt):
while True:
try:
return int(input(prompt))
except ValueError:
print("Введите целое число.")
# Файлы
try:
with open("config.json") as f:
config = json.load(f)
except FileNotFoundError:
config = {}
# Сеть / API
try:
response = requests.get(url, timeout=5)
except (ConnectionError, TimeoutError):
print("Сервер недоступен")
Лучшие практики
| ✅ Делай | ❌ Не делай |
|---|---|
| Ловить конкретные исключения | Голый except: без типа |
Узкий try (только опасный код) |
Весь код в одном try |
| Давать понятные сообщения | except: pass |
finally для очистки ресурсов |
try/except вместо проверок |
Золотое правило: Используй try/except там, где не можешь предсказать результат — ввод пользователя, файлы, сеть.
💬 Комментарии (0)
Комментариев пока нет
Станьте первым, кто поделится мнением об этой статье!