Hur definierar man anpassade undantag i Python? (Med exempel)

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 Exceptionklassen. 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 CustomErrorsom ärver från Exceptionklassen. Detta nya undantag kan, liksom andra undantag, tas upp med raiseuttalandet 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.pyeller 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 ( ValueTooSmallErroroch 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 Exceptionklassens konstruktör att acceptera våra egna anpassade argument salaryoch message. Därefter Exceptionanropas konstruktören för föräldraklassen manuellt med self.messageargumentet med super().

Det anpassade self.salaryattributet definieras för att användas senare.

Den ärvda __str__metoden i Exceptionklassen används sedan för att visa motsvarande meddelande när den SalaryNotInRangeErrorhö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.

Intressanta artiklar...