Обработка исключений: try, except, else, finally
Когда ошибка — не конец 🔥
Программы, как и люди, ошибаются. Но в Python ошибки можно предвидеть и обработать грамотно! Давай разберёмся, как превратить падение программы в изящное решение проблемы.
print(10 / 0) # ZeroDivisionError: division by zero
Такой код завершится с ошибкой. Но что, если мы хотим продолжить работу?
Базовый синтаксис: try-except
Основной инструмент — конструкция try-except. Работает просто:
1. Пробуем выполнить код в try
2. Если ошибка — переходим в except
try:
result = 10 / 0
except ZeroDivisionError:
print("Ой, деление на ноль! Исправь это!") # Сработает этот блок
Ловим конкретные исключения 🎯
Можно указывать конкретные типы ошибок для разных ситуаций:
try:
# Код, который может упасть
file = open("несуществующий_файл.txt", "r")
except FileNotFoundError:
print("Файл не найден! Создаю новый...")
except PermissionError:
print("Нет прав доступа!")
except Exception as e: # Ловим ВСЕ ошибки (не рекомендуется без нужды)
print(f"Неожиданная ошибка: {e}")
Полный набор: else и finally
Конструкция становится мощнее с дополнительными блоками:
try:
print("Пытаемся что-то сделать...")
result = 10 / 2 # Успешное выполнение
except ZeroDivisionError:
print("Деление на ноль!")
else:
print("Всё прошло успешно! Результат:", result) # Сработает этот блок
finally:
print("Это выполнится ВСЕГДА") # И этот тоже
else— выполняется, если не было исключенийfinally— выполняется в любом случае (даже при выходе из программы!)
Практикуемся на реальных примерах 💻
Пример 1: Работа с файлами
try:
with open("data.txt", "r") as file:
content = file.read()
except FileNotFoundError:
print("Файл не найден, создаём новый...")
with open("data.txt", "w") as file:
file.write("Новые данные")
else:
print("Содержимое файла:", content)
finally:
print("Операция с файлом завершена")
Пример 2: Валидация ввода пользователя
while True:
try:
age = int(input("Сколько тебе лет? "))
if age < 0:
raise ValueError("Возраст не может быть отрицательным!")
except ValueError as e:
print(f"Ошибка: {e}. Попробуй ещё раз!")
else:
print(f"Тебе {age} лет! Круто!")
break
Кастомные исключения 🛠️
Можно создавать свои классы ошибок для сложных сценариев:
class TooYoungError(Exception):
pass
def check_age(age):
if age < 18:
raise TooYoungError("Доступ запрещён для лиц младше 18 лет!")
return "Добро пожаловать!"
try:
print(check_age(15))
except TooYoungError as e:
print(e) # Выведет сообщение об ошибке
Философия обработки ошибок 🧠
- Лови только то, что можешь обработать — не используй "голый"
except - Будь конкретным — указывай типы исключений
- Документируй — описывай возможные ошибки в docstring
- Не злоупотребляй — иногда лучше дать программе упасть, чем молча проглотить ошибку
# Плохо:
try:
do_something()
except:
pass # Тихий кошмар!
# Хорошо:
try:
do_something()
except SpecificError as e:
handle_error(e)
Продвинутые техники 🚀
Вложенные try-except
try:
try:
risky_operation()
except SpecificError:
handle_specific_error()
except GeneralError:
handle_general_error()
Использование raise без аргументов
try:
something()
except SomeError:
print("Частичная обработка")
raise # Пробрасываем исключение дальше
Визуализация работы try-except 🎨
[Начало]
|
v
try: -- успех --> else --> finally
|
v
возникла ошибка |
| |
v |
except: <----------+
|
v
finally
|
[Конец]
Теперь ты вооружён знаниями, чтобы делать свои программы устойчивыми к ошибкам! Помни: хороший разработчик не тот, кто не делает ошибок, а тот, кто умеет их грамотно обрабатывать. 😉