В этом руководстве вы узнаете, как определять собственные исключения в зависимости от ваших требований с помощью примеров.
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 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.")
Вот пример запуска этой программы.
Введите число: 12 Это слишком большое значение, попробуйте еще раз! Введите число: 0 Это слишком маленькое значение, попробуйте еще раз! Введите число: 8 Это слишком маленькое значение, попробуйте еще раз! Введите число: 10 Поздравляем! Вы правильно угадали.
Мы определили базовый класс с именем 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)
Вывод
Введите сумму зарплаты: 2000 Traceback (последний вызов последним): файл "", строка 17, в строке повышения SalaryNotInRangeError (salary) __main __. SalaryNotInRangeError: Salary is not in (5000, 15000) range
Здесь мы переопределили конструктор Exception
класса, чтобы он принимал наши собственные настраиваемые аргументы salary
и message
. Затем конструктор родительского Exception
класса вызывается вручную с self.message
аргументом using 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)
Вывод
Введите сумму зарплаты: 2000 Traceback (последний звонок последним): файл "/home/bsoyuj/Desktop/Untitled-1.py", строка 20, в строке повышения SalaryNotInRangeError (salary) __main __. SalaryNotInRangeError: 2000 -> Salary is not in ( 5000, 15000) диапазон
Чтобы узнать больше о том, как вы можете обрабатывать исключения в Python, посетите Python Exception Handling.