- Создание настраиваемых исключений в Python
- Создайте собственный класс исключений в Python
- Выполнение вызова исключения с использованием ключевого слова raise в Python
- Объявление настраиваемого сообщения об исключении в Python
- Выполнение обработки исключений с помощью блока try. except в Python
- Сопутствующая статья — Python Exception
Создание настраиваемых исключений в Python
- Создайте собственный класс исключений в Python
- Выполнение обработки исключений с помощью блока 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 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 (обязательно) — основной блок, отвечающий за инкапсуляцию блока кода, в котором может быть вызвано исключение. Блок 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 используются для обертывания одного или нескольких исключений в блоке кода и изменения того, что делает код при обработке этого исключения, а не просто для полного завершения программы.
Skilled in Python, Java, Spring Boot, AngularJS, and Agile Methodologies. Strong engineering professional with a passion for development and always seeking opportunities for personal and career growth. A Technical Writer writing about comprehensive how-to articles, environment set-ups, and technical walkthroughs. Specializes in writing Python, Java, Spring, and SQL articles.