I denne vejledning lærer du, hvordan du definerer brugerdefinerede undtagelser afhængigt af dine krav ved hjælp af eksempler.
Python har adskillige indbyggede undtagelser, der tvinger dit program til at udsende en fejl, når noget i programmet går galt.
Men nogle gange kan det være nødvendigt at oprette dine egne brugerdefinerede undtagelser, der tjener dit formål.
Oprettelse af brugerdefinerede undtagelser
I Python kan brugerne definere brugerdefinerede undtagelser ved at oprette en ny klasse. Denne undtagelsesklasse skal afledes enten direkte eller indirekte fra den indbyggede Exception
klasse. De fleste af de indbyggede undtagelser stammer også fra denne klasse.
>>> 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
Her har vi oprettet en brugerdefineret undtagelse kaldet CustomError
som arver fra Exception
klassen. Denne nye undtagelse kan, ligesom andre undtagelser, hæves ved hjælp af raise
udsagnet med en valgfri fejlmeddelelse.
Når vi udvikler et stort Python-program, er det en god praksis at placere alle brugerdefinerede undtagelser, som vores program rejser i en separat fil. Mange standardmoduler gør dette. De definerer deres undtagelser separat som exceptions.py
eller errors.py
(generelt men ikke altid).
Brugerdefineret undtagelsesklasse kan implementere alt, hvad en normal klasse kan gøre, men vi gør dem generelt enkle og koncise. De fleste implementeringer erklærer en brugerdefineret baseklasse og udleder andre undtagelsesklasser fra denne basisklasse. Dette koncept gøres klarere i det følgende eksempel.
Eksempel: Brugerdefineret undtagelse i Python
I dette eksempel illustrerer vi, hvordan brugerdefinerede undtagelser kan bruges i et program til at hæve og fange fejl.
Dette program beder brugeren om at indtaste et nummer, indtil de gætter et gemt nummer korrekt. For at hjælpe dem med at finde ud af det, gives der et tip, om deres gæt er større end eller mindre end det lagrede nummer.
# 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.")
Her er en prøvekørsel af dette program.
Indtast et tal: 12 Denne værdi er for stor, prøv igen! Indtast et tal: 0 Denne værdi er for lille, prøv igen! Indtast et tal: 8 Denne værdi er for lille, prøv igen! Indtast et nummer: 10 Tillykke! Du gættede det korrekt.
Vi har defineret en basisklasse kaldet Error
.
De to andre undtagelser ( ValueTooSmallError
og ValueTooLargeError
), der faktisk hæves af vores program, stammer fra denne klasse. Dette er standardmetoden til at definere brugerdefinerede undtagelser i Python-programmering, men du er ikke begrænset til kun denne måde.
Tilpasning af undtagelseskurser
Vi kan yderligere tilpasse denne klasse til at acceptere andre argumenter i henhold til vores behov.
For at lære om at tilpasse undtagelsesklasserne skal du have den grundlæggende viden om objektorienteret programmering.
Besøg Python Object Oriented Programming for at begynde at lære om Object-Oriented programmering i Python.
Lad os se på et eksempel:
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
Indtast lønbeløb: 2000 Traceback (seneste opkald sidst): Fil "", linje 17, i løn SalaryNotInRangeError (løn) __main __. SalaryNotInRangeError: Løn er ikke i (5000, 15000) interval
Her har vi tilsidesat Exception
klassens konstruktør til at acceptere vores egne brugerdefinerede argumenter salary
og message
. Derefter Exception
kaldes konstruktøren for overordnet klasse manuelt med self.message
argumentet ved hjælp af super()
.
Den brugerdefinerede self.salary
attribut er defineret til senere brug.
Den arvede __str__
metode i Exception
klassen bruges derefter til at vise den tilsvarende besked, når den SalaryNotInRangeError
hæves.
Vi kan også tilpasse selve __str__
metoden ved at tilsidesætte 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
Indtast lønbeløb: 2000 Traceback (seneste opkald sidst): Fil "/home/bsoyuj/Desktop/Untitled-1.py", linje 20, i løn SalaryNotInRangeError (løn) __main __. SalaryNotInRangeError: 2000 -> Løn er ikke i ( 5000, 15000) rækkevidde
For at lære mere om, hvordan du kan håndtere undtagelser i Python, skal du besøge Python Exception Handling.