Как можно обработать исключения

В Python исключения (ошибки во время выполнения программы) можно обрабатывать с помощью конструкции try...except. Это позволяет предотвратить аварийное завершение программы и управлять ошибками более гибко.

🔥 Что такое исключение?

Исключение — это событие (ошибка), которое возникает во время выполнения программы и прерывает нормальный поток инструкций, если его не обработать.

Примеры исключений:

  • ZeroDivisionError — деление на ноль

  • TypeError — операция с несовместимыми типами

  • ValueError — неправильное значение

  • FileNotFoundError — файл не найден

✅ Основной способ обработки: try...except

try:
\# код, который может вызвать ошибку
except SomeError:
\# код, который выполняется при возникновении этой ошибки

🔍 Пример:

try:
x = 10 / 0
except ZeroDivisionError:
print("Нельзя делить на ноль!")

📤 Вывод:

Нельзя делить на ноль!

🔷 Полный синтаксис обработки исключений

try:
\# код, который может вызвать ошибку
except \[ТипИсключения \[as переменная\]\]:
\# код для обработки ошибки
else:
\# выполнится, если не было исключений
finally:
\# выполнится в любом случае (ошибка была или нет)

▶ Разберём каждый блок:

Блок Назначение
try Код, в котором может произойти исключение
--- ---
except Код, который выполняется при возникновении ошибки
--- ---
else Выполняется, если не было исключения
--- ---
finally Выполняется всегда — даже если ошибка не перехвачена
--- ---

🔍 Примеры:

▶ Обработка разных исключений

try:
a = int(input("Введите число: "))
b = 1 / a
except ValueError:
print("Это не число!")
except ZeroDivisionError:
print("На ноль делить нельзя!")

▶ else и finally

try:
x = 10
y = 2
result = x / y
except ZeroDivisionError:
print("Ошибка деления")
else:
print("Результат:", result)
finally:
print("Блок finally выполнен всегда")

📤 Вывод:

Результат: 5.0

Блок finally выполнен всегда

🧠 Использование as для доступа к объекту ошибки

try:
int("abc")
except ValueError as e:
print("Ошибка:", e)

📤 Вывод:

Ошибка: invalid literal for int() with base 10: 'abc'

🔁 Обработка нескольких ошибок в одном блоке

try:
a = int(input())
b = 10 / a
except (ValueError, ZeroDivisionError) as e:
print("Произошла ошибка:", e)

🚫 Плохая практика: перехватывать всё подряд

try:
risky_code()
except:
print("Что-то пошло не так") # ❗ Это ловит вообще ВСЁ, включая системные ошибки

❌ Так делать не рекомендуется, потому что:

  • Могут скрыться важные ошибки (например, KeyboardInterrupt, SystemExit)

  • Трудно отладить

✅ Лучше перехватывать конкретные ошибки:

try:
open("файл.txt")
except FileNotFoundError:
print("Файл не найден!")

🧩 Создание собственных исключений

Можно определить своё исключение как подкласс Exception:

class MyError(Exception):
pass
try:
raise MyError("Это моя ошибка")
except MyError as e:
print("Поймана:", e)

🧹 Применение finally для очистки

finally используется для закрытия файлов, соединений, даже если произошла ошибка:

try:
f = open("data.txt")
\# работа с файлом
except FileNotFoundError:
print("Файл не найден")
finally:
print("Закрываем файл")
\# f.close() — будет вызван даже при ошибке

🛠️ Пример: безопасное открытие файла

try:
with open("data.txt") as f:
content = f.read()
except FileNotFoundError:
print("Файл не найден")
with сам вызывает finally, закрывая файл.

🧠 Почему важно обрабатывать исключения?

  • Предотвращает падение программы.

  • Позволяет давать пользователю полезные сообщения.

  • Защищает от повреждения данных.

  • Позволяет писать надёжный код.