Пользовательские исключения 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.