Обработка ошибок и исключений

В процессе работы программы могут случаться различные непредвиденные проблемы.
Например:
- При скачивании файла оборвалось соединение...
-- Такое вполне может произойти, например если у пользователя плохой сигнал wi-fi.
- При попытке записать файл на USB устройство и устройство оказалось недоступно...
-- Такое может случиться, если пользователь задел рукой USB устройство.
- При попытке выполнить запрос к базе данных, может оказаться, что она недоступна.
-- Такое может случиться, если сервер с БД выключился/перезагрузился и т.п.
Примеров можно приводить много. Любая из этих проблем, потенциально может вывести из строя вашу программу.

Ошибки в работе программы - это конечно плохо, и к сожалению они случаются. Было бы неплохо их максимально предсказывать и если они случаются, то лучше постараться быть вкурсе и держать ситуацию под контролем.

Обработка ошибок и исключений — это важная часть программирования, которая позволяет управлять неожиданными ситуациями, возникающими во время выполнения программы. В Python для этого используются конструкции try, except, finally и raise.


Основные понятия

  • Исключение (Exception): Это ошибка, которая возникает во время выполнения программы.

  • Обработка исключений: Механизм, который позволяет "поймать" исключение и выполнить определённые действия вместо завершения программы.

  • Стек вызовов: Цепочка вызовов функций, которая привела к исключению.


Блок try-except

Конструкция try-except используется для обработки исключений. Код, который может вызвать исключение, помещается в блок try, а обработка исключения — в блок except.

Пример:
try: num = int(input("Введите число: ")) result = 10 / num print("Результат:", result) except ValueError: print("Ошибка: Введено не число!") except ZeroDivisionError: print("Ошибка: Деление на ноль!")
Пояснение:
  • Если пользователь введёт не число, сработает ValueError.

  • Если пользователь введёт 0, сработает ZeroDivisionError.


Блок finally

Блок finally выполняется всегда, независимо от того, произошло исключение или нет. Он используется для освобождения ресурсов (например, закрытия файлов).

Пример:
try: file = open("example.txt", "r") content = file.read() print(content) except FileNotFoundError: print("Ошибка: Файл не найден!") finally: file.close() print("Файл закрыт.")

Блок else

Блок else выполняется, если в блоке try не возникло исключений.

Пример:
try: num = int(input("Введите число: ")) result = 10 / num except ValueError: print("Ошибка: Введено не число!") except ZeroDivisionError: print("Ошибка: Деление на ноль!") else: print("Результат:", result)

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

Вы можете создавать собственные исключения, наследуясь от класса Exception.

Пример:
class MyCustomError(Exception): pass def check_value(value): if value < 0: raise MyCustomError("Ошибка: Значение не может быть отрицательным!") try: check_value(-10) except MyCustomError as e: print(e)

Иерархия исключений

Все исключения в Python наследуются от базового класса BaseException. Наиболее часто используемый класс — Exception.

Пример иерархии:
BaseException
 ├── SystemExit
 ├── KeyboardInterrupt
 ├── GeneratorExit
 └── Exception
      ├── ValueError
      ├── TypeError
      ├── ZeroDivisionError
      └── ...

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

Пример 1: Обработка нескольких исключений
try: num = int(input("Введите число: ")) result = 10 / num print("Результат:", result) except (ValueError, ZeroDivisionError) as e: print(f"Произошла ошибка: {e}")
Пример 2: Ловля всех исключений
try: risky_operation() except Exception as e: print(f"Произошла ошибка: {e}")
Пример 3: Повторное возбуждение исключения
try: risky_operation() except ValueError as e: print("Ошибка ValueError") raise # Повторно возбуждает исключение

Рекомендации

  • Не ловите все исключения без разбора: Это может скрыть реальные ошибки в коде.

  • Используйте конкретные исключения: Это делает код более читаемым и понятным.

  • Логируйте ошибки: Используйте модуль logging для записи ошибок в лог-файл.


Обработка ошибок и исключений — это важный механизм, который позволяет писать устойчивые и надёжные программы. Используйте try-except для обработки ожидаемых ошибок, finally для освобождения ресурсов и создавайте собственные исключения для более точного управления ошибками. И конечно решайте задачи для лучшего усвоения теоретического материала!


Комментарии

Добавить комментарий

Чтобы оставить комменатрий необходимо Авторизоваться