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

  1. Создайте собственный класс исключений в Python
  2. Выполнение обработки исключений с помощью блока try...except в Python

Это руководство продемонстрирует, как вы можете создавать собственные классы исключений в Python. Здесь мы покажем, как правильно выполнять обработку исключений, определять собственные классы исключений и переопределять существующие встроенные исключения.

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

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

Создание класса исключения в Python выполняется так же, как и для обычного класса. Основное отличие состоит в том, что вы должны включить базовый класс Python Exception, чтобы сообщить компилятору, что создаваемый вами класс является классом исключения.

Давайте протестируем этот метод, чтобы создать класс исключения с именем DemoException и использовать ключевое слово потока управления заполнителем pass внутри в качестве заполнителя.

class DemoException(Exception):
    pass

Выполнение вызова исключения с использованием ключевого слова raise в Python

Чтобы протестировать класс DemoException и увидеть, что он отображает при фактическом срабатывании, выполните создание исключения. Возбуждение исключения является синонимом выброса исключения в других языках программирования.

Используя ключевое слово raise, запускает исключение, используя данный класс исключения, и выводит сообщение об исключении.

class DemoException(Exception):
    pass

raise DemoException

Выход:

Traceback (most recent call last):
  File "/Users/demo/python/demo_exception.py", line 4, in <module>
    raise DemoException
__main__.DemoException

Стандартное исключение будет выглядеть в терминале, если не было объявлено настраиваемое сообщение об исключении.

Объявление настраиваемого сообщения об исключении в Python

Чтобы объявить настраиваемое сообщение об исключении для DemoException, переопределите метод __init__() класса исключения и включите в параметры сообщение, которое должно выводиться для исключения, вместе с обязательным параметром ссылки на себя self.

Например, переопределим метод __init__() и создадим собственное сообщение для класса DemoException:

class DemoException(Exception):
    def __init__(self, message):
        super().__init__(message)

Обратите внимание, что для успешной интеграции сообщения в ваше исключение вызовите базовый класс Exception, метод __init__() и включите message в качестве аргумента.

Давайте снова вызовем класс исключения, используя ключевое слово raise, а теперь передавая с ним собственное сообщение:

class DemoException(Exception):
    def __init__(self, message):
        super().__init__(message)
        
message = "Exception Triggered! Something went wrong."
raise DemoException(message)

Результат должен выглядеть так:

Traceback (most recent call last):
  File "/Users/demo/python/helloworld.py", line 6, in <module>
    raise DemoException(message)
__main__.DemoException: Exception Triggered! Something went wrong.

Теперь мы успешно создали и запустили класс исключения с настраиваемым сообщением об ошибке.

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

Выполнение обработки исключений с помощью блока try...except в Python

Блок try...except очень похож на блок try-catch в других языках, таких как Java.

Блок try...except имеет 2 основных блока и 2 дополнительных блока:

  • try (обязательно) - основной блок, отвечающий за инкапсуляцию блока кода, в котором может быть вызвано исключение. Блок try останавливает весь процесс в нем при возникновении исключения.
  • except (обязательно) - программа блока продолжается всякий раз, когда инициируется указанное исключение. Этот блок обычно содержит описательное сообщение об ошибке для вызывающего абонента или просто простую инструкцию print(). В одном блоке try может быть более одного блока except, каждый из которых перехватывает разные исключения.
  • else (необязательно) - в этом необязательном блоке программа продолжит работу, если блок try не вызвал никаких исключений.
  • finally (необязательно) - этот необязательный блок запускается после того, как все из предыдущих 3 блоков было выполнено, независимо от того, инициировано ли исключение или нет.

Давайте воспользуемся предыдущим примером с использованием класса DemoException, чтобы попробовать простой блок try...except.

Сначала оберните ключевое слово raise в функцию и поместите его в блок try...except.

Функция, которую мы создадим для этого примера, - это функция, которая принимает число и выдает исключение, если оно отправляет 0. Если он отправит любой другой номер, то код будет работать так, как задумано. Посмотрите пример ниже:

class DemoException(Exception):
    def __init__(self, message):
        super().__init__(message)
        

message = "Exception Triggered! Something went wrong."

def triggerException(num):
    if (num == 0):
        raise DemoException(message)
    else:
        print(num)


try:
    triggerException(0)
    print("Code has successfully been executed.")
except DemoException:
    print("Error: Number should not be 0.")

Поскольку triggerException() передало 0 в качестве аргумента, код должен вызвать DemoException. Здесь мы должны ожидать, что сообщение с ключевым словом raise будет заменено тем, что находится внутри блока except в качестве вывода.

Обратите внимание, что строка print() после вызова функции triggerException() не выводилась. Это потому, что функция вызвала исключение; поэтому он немедленно остановил все процессы в блоке try и перешел непосредственно к блоку except.

Выход:

Error: Number should not be 0.

Теперь давайте попробуем передать допустимое число, например, 20.

try:
    triggerException(20)
    print("Code has successfully been executed.")
except DemoException:
    print("Error: Number should not be 0.")

Выход:

20
Code has successfully been executed.

Попробуем объединить блоки except и создать еще одно исключение. Назовем новое исключение NumberFormatException, которое срабатывает, если заданный вход не является числом. Для этого класса исключения давайте объявим сообщение внутри класса.

class NumberFormatException(Exception, value):
    message = f'{value} is not a number'
    def __init__(self):
        super().__init__(message)

Теперь измените приведенный выше код для обработки нового класса исключения NumberFormatException:

class DemoException(Exception):
    def __init__(self, message):
        super().__init__(message)
        
class NumberFormatException(Exception):
    def __init__(self, message, value):
        message = f'{value} is not a number'
        super().__init__(message)
        
message = "Exception occured."

def triggerException(num):
    if (not num.isdigit()):
        raise NumberFormatException(message, num)
    elif (num == 0):
        raise DemoException(message)
    else:
        print(num)

num = "sample string"
try:
    triggerException(num)
    print("Code has successfully been executed.")
except DemoException:
    print("Error: Number should not be 0.")
except NumberFormatException:
    print(num+" is not a number.")

В этом коде значение num, которое было передано в triggerException(), является строкой 'sample string', поэтому должно сработать NumberFormatException.

Выход:

sample string is not a number.

Таким образом, создание пользовательских исключений в Python так же просто, как создание нового класса, но с классом Exception в качестве дополнительного аргумента в определении класса. Ключевое слово raise используется для запуска исключений с учетом класса исключения. Блоки try...except используются для обертывания одного или нескольких исключений в блоке кода и изменения того, что делает код при обработке этого исключения, а не просто для полного завершения программы.

Сопутствующая статья - Python Exception

  • Используйте блок try ... else в Python