Как можно перехватывать пользовательские исключения в Python?

Для перехвата пользовательских исключений в Python используется конструкция try...except. Сначала код, который может вызвать исключение, помещается в блок try. Затем, в блоке except указывается тип исключения, которое нужно перехватить, и код, который будет выполнен в случае возникновения этого исключения. Можно перехватывать несколько типов исключений, используя несколько блоков except, либо один блок except (Type1, Type2, ...). Можно также использовать блок except Exception as e для перехвата всех исключений, но это не рекомендуется. Блок finally выполнится в любом случае, независимо от того, было ли исключение или нет.

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

Основные шаги:

  1. Определите пользовательское исключение: Создайте класс исключения, который наследуется от Exception. Вы можете добавить свои атрибуты и методы для хранения дополнительной информации об ошибке.
  2. Вызовите исключение: В коде, где может произойти ошибка, используйте raise, чтобы вызвать ваше пользовательское исключение.
  3. Перехватите исключение: Оберните код, который может вызвать исключение, в блок try. После блока try добавьте один или несколько блоков except, чтобы обработать исключение. Укажите класс исключения, которое вы хотите перехватить в блоке except.

Пример:


    # Определение пользовательского исключения
    class MyCustomError(Exception):
        def __init__(self, message, error_code):
            super().__init__(message)
            self.error_code = error_code

    # Функция, которая может вызвать исключение
    def process_data(data):
        if data is None:
            raise MyCustomError("Данные не могут быть None", 1001)
        # ... остальной код ...
        return "Данные успешно обработаны"

    # Перехват исключения
    try:
        result = process_data(None)
        print(result)
    except MyCustomError as e:
        print(f"Произошла ошибка: {e}")
        print(f"Код ошибки: {e.error_code}")
    except Exception as e: # обработка любых других исключений. 
        print(f"Произошла непредвиденная ошибка: {e}")
    finally:
        print("Этот блок выполняется всегда, независимо от того, произошло исключение или нет.")
  

Объяснение:

  • Класс MyCustomError наследуется от Exception и позволяет передавать сообщение об ошибке и код ошибки.
  • Функция process_data вызывает MyCustomError, если входные данные равны None.
  • Блок try...except перехватывает MyCustomError и печатает сообщение об ошибке и код ошибки. Блок `except Exception as e` перехватывает все другие исключения, которые могут произойти в блоке `try`. Блок `finally` выполняется всегда, независимо от того, было ли выброшено исключение.

Важно:

  • Всегда старайтесь указывать конкретный тип исключения в блоке except. Избегайте перехвата просто Exception без необходимости, так как это может скрыть неожиданные ошибки.
  • Используйте блок finally для выполнения кода, который должен быть выполнен в любом случае (например, закрытие файлов или освобождение ресурсов).
  • Вы можете иметь несколько блоков except для обработки разных типов исключений. Порядок блоков except важен: они проверяются сверху вниз, и выполняется только первый блок, соответствующий типу исключения.
0