Skip to content

Exception - Исключения в Python: Обработка ошибок и нештатных ситуаций

В Python, как и в любом другом языке программирования, во время выполнения кода могут возникать ошибки. Эти ошибки могут быть вызваны различными причинами: некорректным вводом данных, попыткой деления на ноль, отсутствием файла, который программа пытается открыть, и многими другими. Для управления такими ситуациями в Python используется механизм исключений (Exceptions).

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

Исключение – это событие, которое происходит во время выполнения программы и прерывает ее нормальный ход. Когда Python сталкивается с ошибкой, он возбуждает (raises) исключение. Если это исключение не обработано (handled), программа аварийно завершается, выводя сообщение об ошибке.

Зачем нужны исключения?

  • Надежность: Исключения позволяют программе корректно реагировать на ошибки и продолжать работу, даже если что-то пошло не так. Вместо аварийного завершения, можно, например, вывести пользователю понятное сообщение об ошибке или предпринять альтернативные действия.
  • Читаемость кода: Обработка ошибок с помощью исключений делает код более структурированным и понятным. Логика обработки ошибок отделяется от основного кода программы.
  • Разделение ответственности: Исключения позволяют разделить ответственность за обработку ошибок между разными частями программы. Функция может возбуждать исключение, сигнализируя о проблеме, а вызывающий код может это исключение обработать.

Основные типы исключений

В Python существует множество встроенных исключений, каждое из которых соответствует определенному типу ошибки. Вот некоторые из наиболее распространенных:

  • Exception: Базовый класс для всех невстроенных исключений. Обычно используется для создания пользовательских исключений.
  • TypeError: Возникает при выполнении операции или функции с объектом неподходящего типа. Например, попытка сложить строку и число.
  • ValueError: Возникает, когда функция получает аргумент правильного типа, но с неподходящим значением. Например, попытка извлечь корень из отрицательного числа.
  • NameError: Возникает, когда не удается найти локальную или глобальную переменную. Например, обращение к несуществующей переменной.
  • IndexError: Возникает при обращении к несуществующему индексу последовательности (списка, кортежа, строки).
  • KeyError: Возникает при обращении к несуществующему ключу словаря.
  • FileNotFoundError: Возникает при попытке открыть несуществующий файл.
  • ZeroDivisionError: Возникает при делении на ноль.
  • AttributeError: Возникает при обращении к несуществующему атрибуту объекта.
  • ImportError: Возникает при ошибке импорта модуля.
  • IOError: Общее исключение для ошибок ввода/вывода. (В Python 3.x, IOError было переименовано в OSError и IOError теперь является синонимом OSError)
  • OSError: Возникает при ошибках связанных с операционной системой.

Обработка исключений: try...except...else...finally

Для обработки исключений в Python используется конструкция try...except...else...finally.

  • try: Блок кода, в котором может возникнуть исключение.
  • except: Блок кода, который выполняется, если в блоке try возникло исключение. Можно указать конкретный тип исключения, которое нужно обработать, или использовать except без указания типа для обработки любых исключений. Можно использовать несколько блоков except для обработки разных типов исключений.
  • else: (Необязательный) Блок кода, который выполняется, если в блоке try не возникло исключений.
  • finally: (Необязательный) Блок кода, который выполняется всегда, независимо от того, возникло исключение или нет. Обычно используется для освобождения ресурсов (закрытия файлов, соединений и т.д.).

Пример:

python
try:
    num1 = int(input("Введите первое число: "))
    num2 = int(input("Введите второе число: "))
    result = num1 / num2
    print("Результат деления:", result)
except ValueError:
    print("Ошибка: Введено не число!")
except ZeroDivisionError:
    print("Ошибка: Деление на ноль невозможно!")
except Exception as e:
    print(f"Произошла непредвиденная ошибка: {e}")
else:
    print("Деление выполнено успешно.")
finally:
    print("Программа завершена.")

Разбор примера:

  1. try: Пользователю предлагается ввести два числа. Выполняется деление.
  2. except ValueError: Если пользователь ввел не число (например, строку), возникает исключение ValueError, и выполняется этот блок.
  3. except ZeroDivisionError: Если второе число равно нулю, возникает исключение ZeroDivisionError, и выполняется этот блок.
  4. except Exception as e: Если возникает какое-либо другое исключение, оно перехватывается этим блоком. Переменной e присваивается объект исключения, и его строковое представление выводится на экран. Это хороший способ отловить и залогировать неожиданные ошибки.
  5. else: Если исключений не возникло, выполняется этот блок.
  6. finally: Этот блок выполняется в любом случае.