Пользовательские исключения Python
Пользовательские исключения Python
В этом руководстве вы узнаете, как определять собственные исключения в зависимости от ваших требований с помощью примеров.
Python имеет множество встроенных исключений, которые заставляют вашу программу выводить ошибку, когда что-то в программе идет не так.
Однако иногда вам может понадобиться создать свои собственные исключения, которые служат вашей цели.
<час>Создание пользовательских исключений
В Python пользователи могут определять собственные исключения, создавая новый класс. Этот класс исключений должен быть прямо или косвенно получен из встроенного класса Exception
. учебный класс. Большинство встроенных исключений также являются производными от этого класса.
>>> class CustomError(Exception):
... pass
...
>>> raise CustomError
Traceback (most recent call last):
...
__main__.CustomError
>>> raise CustomError("An error occurred")
Traceback (most recent call last):
...
__main__.CustomError: An error occurred
Здесь мы создали определяемое пользователем исключение с именем CustomError
. который наследуется от Exception
учебный класс. Это новое исключение, как и другие исключения, можно вызвать с помощью raise
оператор с необязательным сообщением об ошибке.
Когда мы разрабатываем большую программу на Python, рекомендуется помещать все определяемые пользователем исключения, которые вызывает наша программа, в отдельный файл. Многие стандартные модули делают это. Они определяют свои исключения отдельно как exceptions.py
или errors.py
(обычно, но не всегда).
Пользовательский класс исключений может реализовать все, что может делать обычный класс, но мы обычно делаем их простыми и лаконичными. Большинство реализаций объявляют пользовательский базовый класс и производят другие классы исключений из этого базового класса. Эта концепция проясняется в следующем примере.
<час>Пример:определяемое пользователем исключение в Python
В этом примере мы покажем, как пользовательские исключения могут использоваться в программе для создания и перехвата ошибок.
Эта программа будет просить пользователя вводить число до тех пор, пока он не угадает сохраненное число правильно. Чтобы помочь им понять это, предоставляется подсказка, является ли их предположение больше или меньше сохраненного числа.
# define Python user-defined exceptions
class Error(Exception):
"""Base class for other exceptions"""
pass
class ValueTooSmallError(Error):
"""Raised when the input value is too small"""
pass
class ValueTooLargeError(Error):
"""Raised when the input value is too large"""
pass
# you need to guess this number
number = 10
# user guesses a number until he/she gets it right
while True:
try:
i_num = int(input("Enter a number: "))
if i_num < number:
raise ValueTooSmallError
elif i_num > number:
raise ValueTooLargeError
break
except ValueTooSmallError:
print("This value is too small, try again!")
print()
except ValueTooLargeError:
print("This value is too large, try again!")
print()
print("Congratulations! You guessed it correctly.")
Вот пример запуска этой программы.
Enter a number: 12 This value is too large, try again! Enter a number: 0 This value is too small, try again! Enter a number: 8 This value is too small, try again! Enter a number: 10 Congratulations! You guessed it correctly.
Мы определили базовый класс с именем Error
. .
Два других исключения (ValueTooSmallError
и ValueTooLargeError
), которые фактически вызываются нашей программой, являются производными от этого класса. Это стандартный способ определения пользовательских исключений в программировании на Python, но вы не ограничены только этим способом.
Настройка классов исключений
Мы можем дополнительно настроить этот класс, чтобы он принимал другие аргументы в соответствии с нашими потребностями.
Чтобы научиться настраивать классы исключений, вам необходимы базовые знания объектно-ориентированного программирования.
Посетите объектно-ориентированное программирование на 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
поднимается.
Мы также можем настроить __str__
сам метод, переопределив его.
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)
def __str__(self):
return f'{self.salary} -> {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 "/home/bsoyuj/Desktop/Untitled-1.py", line 20, in <module> raise SalaryNotInRangeError(salary) __main__.SalaryNotInRangeError: 2000 -> Salary is not in (5000, 15000) range<час>
Чтобы узнать больше о том, как вы можете обрабатывать исключения в Python, посетите страницу Python Exception Handling.
Python