Izjeme so zmogljiv in eleganten način obravnavanja napak v vaših programih Python. Izjeme po meri dvignejo to moč na novo raven.
Pythonovi vgrajeni razredi izjem ne obravnavajo določenih napak, ki se lahko pojavijo v vaši kodi. V takih primerih boste morali ustvariti izjeme po meri za učinkovito obravnavo teh napak.
V Pythonu lahko definirate izjeme po meri in jih dvignete, ko pride do posebnih napak. Posebne, informativne napake lahko upravljate z izjemami po meri, s čimer izboljšate berljivost in vzdržljivost kode.
Zakaj potrebujete izjeme po meri?
Med razvojem aplikacije lahko pride do različnih scenarijev napak zaradi sprememb kode, integracije z drugimi paketi ali knjižnicami in interakcij z zunanjimi aplikacijami. Bistvenega pomena je, da te napake obravnavate, da si jih opomorete ali elegantno obravnavate napake.
Python ponuja vrsto vgrajena izjema razrede, ki pokrivajo napake kot npr ValueError, TypeError, FileNotFoundError, in več. Čeprav te vgrajene izjeme dobro služijo svojemu namenu, morda le včasih natančno predstavljajo napake, ki se lahko pojavijo v vaši aplikaciji.
Z ustvarjanjem izjem po meri jih lahko prilagodite tako, da ustrezajo zahtevam vaše aplikacije, in zagotovite informacije razvijalcem, ki uporabljajo vašo kodo.
Kako definirati izjeme po meri
Če želite ustvariti izjeme po meri, definirati razred Python ki podeduje od Razred izjeme. The Izjema razred ponuja osnovno funkcionalnost, ki jo boste potrebovali za obravnavanje izjem, in ga lahko prilagodite za dodajanje funkcij glede na vaše posebne potrebe.
Ko ustvarjate razrede izjem po meri, naj bodo preprosti, hkrati pa vključite potrebne atribute za shranjevanje informacij o napakah. Upravljavci izjem lahko nato dostopajo do teh atributov in ustrezno obravnavajo napake.
Tukaj je razred izjem po meri, MyCustomError:
classMyCustomError(Exception):
def__init__(self, message=None):
self.message = message
super().__init__(message)
Ta razred med inicializacijo sprejme izbirni argument sporočila. Uporablja super() metoda za klic konstruktorja baze Izjema razred, ki je bistvenega pomena za obravnavanje izjem.
Kako sprožiti izjeme po meri
Če želite prikazati napako, uporabite dvigniti ključna beseda, ki ji sledi primerek vašega razreda izjem po meri, ki ji posreduje sporočilo o napaki kot argument:
ifTrue:
raise MyCustomError("A Custom Error Was Raised...")
Napako lahko povečate tudi brez posredovanja argumentov:
ifTrue:
raise MyCustomError # shorthand
Katera koli oblika je primerna za prikaz napak po meri.
Kako ravnati z izjemami po meri
Obravnava izjem po meri sledi istemu pristopu kot obravnavanje vgrajenih izjem. Uporaba poskusi, razen, in končno bloke za lovljenje izjem po meri in ustrezno ukrepanje.
try:
print("Hello, You're learning how to MakeUseOf Custom Errors")
raise MyCustomError("Opps, Something Went Wrong...")
except MyCustomError as err:
print(f"Error: {err}")
finally:
print("Done Handling Custom Error")
Na ta način lahko obravnavate vse oblike sproženih izjem po meri.
Če med izvajanjem a poskusi blok, ustrezen razen blok ga lahko ujame in obvlada. Če ni ustreznega razen blok za obravnavo izjeme, kateri koli končno blok se bo izvedel, čemur bo sledila ponovna vzpostavitev izjeme. Uporabi končno blok predvsem za izvajanje opravil čiščenja, ki se morajo izvajati v kakršnih koli okoliščinah, ne glede na to, ali pride do izjeme ali ne.
try:
raise KeyboardInterrupt
except MyCustomError as err:
print(f"Error: {err}")
finally:
print("Did not Handle the KeyboardInterrupt Error. \
Can Only Handle MyCustomError")
V tem vzorcu je a KeyboardInterrupt pride do izjem, vendar razen blok samo ročaje MyCustomError izjeme. V tem primeru je končno blok zažene, nato pa se neobravnavana izjema znova sproži.
Dedovanje razredov napak po meri
Temelji na koncept objektno orientiranega programiranja (OOP), lahko tudi dedujete iz razredov izjem po meri, tako kot običajni razredi. Z dedovanjem iz razreda izjem po meri lahko ustvarite razrede napak, ki zagotavljajo bolj specifičen kontekst za izjemo. Ta pristop vam omogoča obravnavo napak na različnih ravneh kode in omogoča boljše razumevanje vzroka napake.
Recimo, da razvijate spletno aplikacijo, ki sodeluje z zunanjim API-jem. Ta API ima lahko različne scenarije napak. Te napake boste želeli dosledno in jasno obravnavati v svoji kodi. Če želite to doseči, ustvarite razred izjem po meri, BaseAPIException:
classBaseAPIException(Exception):
Base class for API-related exceptions.
def__init__(self, message):
super().__init__(message)
self.message = message
Ko imate ta osnovni razred izjem po meri, lahko ustvarite razrede podrejenih izjem, ki ga podedujejo:
classAPINotFoundError(BaseAPIException):
Raised when the requested resource is not found in the API.
passclassAPIAuthenticationError(BaseAPIException):
Raised when there's an issue with authentication to the API.
pass
classAPIRateLimitExceeded(BaseAPIException):
Raised when the rate limit for API requests is exceeded.
pass
Pri klicanju API-ja znotraj vaše spletne aplikacije dvignite in ujemite te izjeme po meri. Ustrezno jih obravnavajte z uporabo ustrezne logike v vaši kodi.
defrequest_api():
try:
# Simulate an API error for demonstration purposes
raise APINotFoundError("Requested resource not found.")
except APINotFoundError as err:
# Log or handle the 'Not Found' error case
print(f"API Not Found Error: {err}")
except APIAuthenticationError:
# Take appropriate actions for authentication error
print(f"API Authentication Error: {err}")
except APIRateLimitExceeded:
# Handle the rate limit exceeded scenario
print(f"API Rate Limit Exceeded: {err}")
except BaseAPIException:
# Handle other unknown API exceptions
print(f"Unknown API Exception: {err}")
Končna klavzula razen preveri v primerjavi z nadrejenim razredom in deluje kot zajezitev vseh drugih napak, povezanih z API-jem.
Ko podedujete razrede izjem po meri, lahko učinkovito obravnavate napake znotraj API-ja. Ta pristop vam omogoča, da ločite obravnavo napak od podrobnosti implementacije API-ja, kar olajša dodajanje izjem po meri ali spreminjanje, ko se API razvija ali naleti na novo napako primerih.
Ovijanje izjem po meri
Zaviti izjeme pomeni ujeti izjemo, jo enkapsulirati v izjemo po meri in nato dvigniti to izjemo po meri, medtem ko se kot njen vzrok sklicevati na prvotno izjemo. Ta tehnika pomaga zagotoviti kontekst za sporočila o napakah in ohranja podrobnosti izvedbe skrite pred klicno kodo.
Razmislite o scenariju, v katerem vaša spletna aplikacija komunicira z API-jem. Če API dvigne a LookupError, lahko ga ujamete, nato dvignete po meri APINotFoundError izjema, ki se kot vzrok sklicuje na napako LookupError:
defrequest_api():
try:
# Simulate an API error for demonstration purposes
# Assuming the external API raised a LookupError
raise LookupError("Sorry, You Encountered A LookUpError !!!")
except LookupError as original_exception:
try:
# Wrap the original exception with a custom exception
raise APINotFoundError \
("Requested resource not found.") from original_exception
except APINotFoundError as wrapped_exception:
# Handle the wrapped exception here
print(f"Caught wrapped API exception: {wrapped_exception}")# or re-raise it if necessary
raise
try:
request_api()
except APINotFoundError as err:
print(f"Caught API exception: {err.__cause__}")
Uporabi od klavzula z dvigniti stavek za sklicevanje na prvotno izjemo znotraj vaše izjeme po meri.
Ko pride do izjeme po meri, vključuje izvirno izjemo kot a __vzrok__ atribut, ki zagotavlja povezavo med izjemo po meri in izvirnikom. To vam omogoča, da izsledite izvor izjeme.
Z ovijanjem izjem lahko zagotovite bolj smiseln kontekst in uporabnikom pošljete ustreznejša sporočila o napakah, ne da bi pri tem razkrili notranje podrobnosti o izvajanju vaše kode ali API-ja. Omogoča tudi upravljanje in obravnavanje vrst napak na strukturiran in enoten način.
Prilagajanje vedenja razreda v Pythonu
Z podedovanjem osnovnega razreda izjem, ki ga ponuja Python, lahko ustvarite preproste in uporabne izjeme, ki jih lahko sprožite, ko se v vaši kodi pojavijo določene napake. Prav tako lahko implementirate vedenje po meri za svoje razrede izjem s pomočjo metod magic ali dunder.