Пользовательские исключения Python
В предыдущем уроке мы узнали о различных встроенных исключениях в Python и о том, почему важно обрабатывать исключения.
Однако иногда нам может понадобиться создать собственные пользовательские исключения, которые служат нашим целям.
Определение пользовательских исключений
В Python мы можем определять пользовательские исключения, создавая новый класс, производный от встроенного класса Exception.
Вот синтаксис определения пользовательских исключений:
class CustomError(Exception):
...
pass
try:
...
except CustomError:
...
Здесь CustomError — пользовательская ошибка, унаследованная от класса Exception.
Примечание
Когда мы разрабатываем большую программу на Python, хорошей практикой является размещение всех пользовательских исключений, которые вызывает наша программа, в отдельном файле.
Многие стандартные модули определяют свои исключения отдельно как
exceptions.pyилиerrors.py(обычно, но не всегда).
Пример: пользовательское исключение Python
# define Python user-defined exceptions
class InvalidAgeException(Exception):
"Raised when the input value is less than 18"
pass
# you need to guess this number
number = 18
try:
input_num = int(input("Enter a number: "))
if input_num < number:
raise InvalidAgeException
else:
print("Eligible to Vote")
except InvalidAgeException:
print("Exception occurred: Invalid Age")
Вывод
Если введённое пользователем значение input_num больше 18,
Enter a number: 45
Eligible to Vote
Если введённое пользователем значение input_num меньше 18,
Enter a number: 14
Exception occurred: Invalid Age
В приведённом выше примере мы определили пользовательское исключение InvalidAgeException, создав новый класс, производный от встроенного класса Exception.
Здесь, когда input_num меньше 18, этот код генерирует исключение.
Когда возникает исключение, остальной код внутри блока try пропускается.
Блок except перехватывает пользовательское исключение InvalidAgeException, и инструкции внутри блока except выполняются.
Настройка классов исключений
Мы можем дополнительно настроить этот класс, чтобы принимать другие аргументы в соответствии с нашими потребностями.
Чтобы изучить настройку классов Exception, вам необходимо иметь базовые знания об объектно-ориентированном программировании.
Посетите Объектно-ориентированное программирование Python, чтобы узнать об ООП в Python.
Рассмотрим пример,
class SalaryNotInRangeError(Exception):
"""Exception raised for errors in the input salary.
Attributes:
salary -- input salary which caused the error
message -- explanation of the error
"""
def __init__(self, salary, message="Salary is not in (5000, 15000) range"):
self.salary = salary
self.message = message
super().__init__(self.message)
salary = int(input("Enter salary amount: "))
if not 5000 < salary < 15000:
raise SalaryNotInRangeError(salary)
Вывод
Enter salary amount: 2000
Traceback (most recent call last):
File "<string>", line 17, in <module>
raise SalaryNotInRangeError(salary)
__main__.SalaryNotInRangeError: Salary is not in (5000, 15000) range
Здесь мы переопределили конструктор класса Exception, чтобы принимать наши собственные пользовательские аргументы salary и message.
Затем конструктор родительского класса Exception вызывается вручную с аргументом self.message с помощью super().
Пользовательский атрибут self.salary определён для использования позже.
Унаследованный метод __str__ класса Exception затем используется для отображения соответствующего сообщения при вызове SalaryNotInRangeError.