Собственные исключения в Python — пример создания

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

Содержание

Пользовательское исключение в Python

Чтобы создать собственный класс исключений, вы определяете класс, который наследуется от встроенного класса Exception или одного из его подклассов, например класса ValueError:

Пользовательское исключение в Python

В следующем примере определяется класс CustomException, который наследуется от класса Exception:

class CustomException(Exception):
    """ my custom exception class """

Обратите внимание, что класс CustomException имеет строку документации, которая ведет себя как инструкция. Таким образом, вам не нужно добавлять оператор pass, чтобы сделать синтаксис действительным.

Чтобы вызвать CustomException, используйте оператор raise:

class CustomException(Exception):
    """ my custom exception class """


try:
    raise CustomException('This is my custom exception')
except CustomException as ex:
    print(ex)

Выход:

This is my custom exception

Как и стандартные, пользовательские исключения также являются классами. Следовательно, вы можете добавить функциональность к пользовательским классам исключений, например:

  • Добавление атрибутов и свойств.
  • Добавление методов, например, регистрация исключения, форматирование вывода и т. д.
  • Переопределение методов __str__ и __repr__.
  • И все остальное, что можно делать с обычными классами.

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

Пример собственного исключения в Python

Предположим, вам нужно разработать программу, которая преобразует температуру из градусов Фаренгейта в градусы Цельсия.

Минимальное и максимальное значения температуры в градусах Фаренгейта — 32 и 212. Если пользователи вводят значение, не входящее в этот диапазон, они хотят создать собственное исключение, например, FahrenheitError.

Определение пользовательского класса исключений FahrenheitError

Ниже определяется класс исключения FahrenheitError:

class FahrenheitError(Exception):
    min_f = 32
    max_f = 212

    def __init__(self, f, *args):
        super().__init__(args)
        self.f = f

    def __str__(self):
        return f'The {self.f} is not in a valid range {self.min_f, self.max_f}'

Как это работает.

  • Сначала определите класс FahrenheitError, который наследуется от класса Exception.
  • Во-вторых, добавьте два атрибута класса min_f и max_f, которые представляют минимальное и максимальное значения по Фаренгейту.
  • В-третьих, определите метод __init__, который принимает значение Фаренгейта(f) и ряд аргументов позиции(*args). В методе __init__ вызовите метод __init__ базового класса. Кроме того, присвойте аргумент f атрибуту экземпляра f.
  • Наконец, переопределите метод __str__, чтобы вернуть собственное строковое представление экземпляра класса.

Определение функции fahrenheit_to_celsius

Ниже определяется функция fahrenheit_to_celsius, которая принимает температуру в градусах Фаренгейта и возвращает в градусах Цельсия:

def fahrenheit_to_celsius(f: float) -> float:
    if f < FahrenheitError.min_f or f > FahrenheitError.max_f:
        raise FahrenheitError(f)

    return(f - 32) * 5 / 9

Функция fahrenheit_to_celsius выдает исключение FahrenheitError, если входная температура выходит за пределы допустимого диапазона. В противном случае он преобразует температуру из Фаренгейта в Цельсия.

Создание основной программы

Следующая основная программа использует функцию fahrenheit_to_celsius и пользовательский класс исключений FahrenheitError:

if __name__ == '__main__':
    f = input('Enter a temperature in Fahrenheit:')
    try:
        f = float(f)
    except ValueError as ex:
        print(ex)
    else:
        try:
            c = fahrenheit_to_celsius(float(f))
        except FahrenheitError as ex:
            print(ex)
        else:
            print(f'{f} Fahrenheit = {c:.4f} Celsius')

Как это работает.

  • Сначала предложите пользователям указать температуру в градусах Фаренгейта.
f = input('Enter a temperature in Fahrenheit:')
  • Во-вторых, преобразуйте входное значение в число с плавающей запятой. Если float() не может преобразовать входное значение, программа выдаст исключение ValueError. В этом случае отображается сообщение об ошибке из исключения ValueError:
try:
    f = float(f)
    # ...
except ValueError as ex:
    print(ex)
  • В-третьих, преобразуйте температуру в градусы Цельсия, вызвав функцию fahrenheit_to_celsius, и распечатайте сообщение об ошибке, если входное значение не является допустимым значением Фаренгейта:
try:
    c = fahrenheit_to_celsius(float(f))
except FahrenheitError as ex:
    print(ex)
else:
    print(f'{f} Fahrenheit = {c:.4f} Celsius')

Полный код

class FahrenheitError(Exception):
    min_f = 32
    max_f = 212

    def __init__(self, f, *args):
        super().__init__(args)
        self.f = f

    def __str__(self):
        return f'The {self.f} is not in a valid range {self.min_f, self.max_f}'


def fahrenheit_to_celsius(f: float) -> float:
    if f < FahrenheitError.min_f or f > FahrenheitError.max_f:
        raise FahrenheitError(f)

    return(f - 32) * 5 / 9


if __name__ == '__main__':
    f = input('Enter a temperature in Fahrenheit:')
    try:
        f = float(f)
    except ValueError as ex:
        print(ex)
    else:
        try:
            c = fahrenheit_to_celsius(float(f))
        except FahrenheitError as ex:
            print(ex)
        else:
            print(f'{f} Fahrenheit = {c:.4f} Celsius')
Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *