I den här handledningen lär du dig hur du definierar anpassade undantag beroende på dina krav med hjälp av exempel.
Python har många inbyggda undantag som tvingar ditt program att mata ut ett fel när något i programmet går fel.
Ibland kan du dock behöva skapa egna egna undantag som tjänar ditt syfte.
Skapa anpassade undantag
I Python kan användare definiera anpassade undantag genom att skapa en ny klass. Denna undantagsklass måste härledas, antingen direkt eller indirekt, från den inbyggda Exception
klassen. De flesta av de inbyggda undantagen härrör också från denna klass.
>>> 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
Här har vi skapat ett användardefinierat undantag som kallas CustomError
som ärver från Exception
klassen. Detta nya undantag kan, liksom andra undantag, tas upp med raise
uttalandet med ett valfritt felmeddelande.
När vi utvecklar ett stort Python-program är det bra att placera alla användardefinierade undantag som vårt program tar upp i en separat fil. Många standardmoduler gör detta. De definierar sina undantag separat som exceptions.py
eller errors.py
(i allmänhet men inte alltid).
Användardefinierad undantagsklass kan implementera allt som en vanlig klass kan göra, men vi gör dem i allmänhet enkla och koncisa. De flesta implementeringar förklarar en anpassad basklass och hämtar andra undantagsklasser från denna basklass. Detta koncept klargörs i följande exempel.
Exempel: Användardefinierat undantag i Python
I det här exemplet kommer vi att illustrera hur användardefinierade undantag kan användas i ett program för att höja och fånga fel.
Detta program kommer att be användaren att ange ett nummer tills de gissar ett lagrat nummer korrekt. För att hjälpa dem att räkna ut det ges en ledtråd om deras gissning är större än eller mindre än det lagrade numret.
# 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.")
Här är ett exempel på körning av detta program.
Ange ett nummer: 12 Detta värde är för stort, försök igen! Ange ett nummer: 0 Detta värde är för litet, försök igen! Ange ett nummer: 8 Detta värde är för litet, försök igen! Ange ett nummer: 10 Grattis! Du gissade det rätt.
Vi har definierat en basklass som heter Error
.
De andra två undantagen ( ValueTooSmallError
och ValueTooLargeError
) som faktiskt tas upp av vårt program härrör från denna klass. Detta är det vanliga sättet att definiera användardefinierade undantag i Python-programmering, men du är inte begränsad till detta sätt.
Anpassa undantagsklasser
Vi kan vidare anpassa denna klass för att acceptera andra argument enligt våra behov.
För att lära dig mer om att anpassa Exception-klasserna måste du ha grundläggande kunskaper om objektorienterad programmering.
Besök Python Object Oriented Programming för att börja lära dig mer om Object-Oriented programmering i Python.
Låt oss titta på ett exempel:
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)
Produktion
Ange lönebelopp: 2000 Traceback (senaste samtal senast): Fil "", rad 17, i höjning SalaryNotInRangeError (lön) __main __. SalaryNotInRangeError: Lön är inte inom (5000, 15000) intervall
Här har vi åsidosatt Exception
klassens konstruktör att acceptera våra egna anpassade argument salary
och message
. Därefter Exception
anropas konstruktören för föräldraklassen manuellt med self.message
argumentet med super()
.
Det anpassade self.salary
attributet definieras för att användas senare.
Den ärvda __str__
metoden i Exception
klassen används sedan för att visa motsvarande meddelande när den SalaryNotInRangeError
höjs.
Vi kan också anpassa själva __str__
metoden genom att åsidosätta den.
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)
Produktion
Ange lönebelopp: 2000 Traceback (senaste samtalet senast): Fil "/home/bsoyuj/Desktop/Untitled-1.py", rad 20, i höjning SalaryNotInRangeError (lön) __main __. SalaryNotInRangeError: 2000 -> Lön finns inte ( 5000, 15000) intervall
För att lära dig mer om hur du kan hantera undantag i Python, besök Python Exception Handling.