В този урок ще научите как да дефинирате персонализирани изключения в зависимост от вашите изисквания с помощта на примери.
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 (заплата) __основен __. SalaryNotInRangeError: Заплатата не е в диапазона (5000, 15000)
Тук сме заменили конструктора на 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)
Изход
Въведете сумата на заплатата: 2000 Traceback (последно последно обаждане): Файл "/home/bsoyuj/Desktop/Untitled-1.py", ред 20, в рейза SalaryNotInRangeError (заплата) __main __. SalaryNotInRangeError: 2000 -> Заплатата не е в ( 5000, 15000) обхват
За да научите повече за това как можете да се справяте с изключения в Python, посетете Python Exception Handling.