Собственные исключения в Python — пример создания
В этом руководстве вы узнаете, как определять и создавать собственные классы исключений в Python.
- Пользовательское исключение в Python
- Пример собственного исключения в Python
- Определение пользовательского класса исключений FahrenheitError
- Определение функции fahrenheit_to_celsius
- Создание основной программы
- Полный код
Пользовательское исключение в Python
Чтобы создать собственный класс исключений, вы определяете класс, который наследуется от встроенного класса Exception или одного из его подклассов, например класса ValueError:
В следующем примере определяется класс 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')