Как можно обработать исключения
В 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, закрывая файл.
🧠 Почему важно обрабатывать исключения?
-
Предотвращает падение программы.
-
Позволяет давать пользователю полезные сообщения.
-
Защищает от повреждения данных.
-
Позволяет писать надёжный код.