Iznimke su moćan i elegantan način rukovanja pogreškama u vašim Python programima. Prilagođene iznimke podižu ovu moć na novu razinu.

Klase iznimke ugrađene u Python ne rješavaju određene situacije pogreške koje se mogu pojaviti u vašem kodu. U takvim slučajevima morat ćete izraditi prilagođene iznimke kako biste učinkovito riješili ove pogreške.

U Pythonu možete definirati prilagođene iznimke i podizati ih kada se pojave specifične situacije pogreške. Možete upravljati specifičnim, informativnim pogreškama s prilagođenim iznimkama, poboljšavajući čitljivost i mogućnost održavanja koda.

Zašto su vam potrebne prilagođene iznimke?

Tijekom razvoja aplikacije mogu se pojaviti različiti scenariji pogrešaka zbog promjena u kodu, integracije s drugim paketima ili bibliotekama i interakcija s vanjskim aplikacijama. Ključno je nositi se s tim pogreškama kako biste se oporavili od njih ili elegantno riješili neuspjeh.

Python nudi niz ugrađena iznimka klase koje pokrivaju greške kao što su ValueError

instagram viewer
, TypeError, FileNotFoundError, i više. Iako ove ugrađene iznimke dobro služe svojoj svrsi, one samo ponekad mogu točno predstavljati pogreške koje se mogu pojaviti u vašoj aplikaciji.

Stvaranjem prilagođenih iznimaka, možete ih posebno prilagoditi zahtjevima vaše aplikacije i pružiti informacije programerima koji koriste vaš kod.

Kako definirati prilagođene iznimke

Da biste stvorili prilagođene iznimke, definiraju Python klasu koji nasljeđuje od Klasa izuzetaka. The Iznimka klasa nudi osnovnu funkcionalnost koja će vam trebati za rukovanje iznimkama, a možete je prilagoditi za dodavanje značajki na temelju vaših specifičnih potreba.

Kada stvarate prilagođene klase iznimke, neka budu jednostavne, a istovremeno uključuju potrebne atribute za pohranu informacija o pogrešci. Rukovatelji iznimkama tada mogu pristupiti tim atributima kako bi ispravno obradili pogreške.

Evo prilagođene klase izuzetaka, MyCustomError:

classMyCustomError(Exception):
def__init__(self, message=None):
self.message = message
super().__init__(message)

Ova klasa prihvaća izborni argument poruke tijekom inicijalizacije. Koristi se super() metoda za pozivanje konstruktora baze Iznimka klasa, koja je neophodna za rukovanje iznimkama.

Kako pokrenuti prilagođene iznimke

Da biste pokrenuli pogrešku, koristite podići ključna riječ nakon koje slijedi instanca vaše prilagođene klase iznimke, prosljeđujući joj poruku o pogrešci kao argument:

ifTrue:
raise MyCustomError("A Custom Error Was Raised...")

Također možete pokrenuti grešku bez prosljeđivanja argumenata:

ifTrue:
raise MyCustomError # shorthand

Oba formata su prikladna za podizanje prilagođenih pogrešaka.

Kako postupati s prilagođenim iznimkama

Rukovanje prilagođenim iznimkama slijedi isti pristup kao rukovanje ugrađenim iznimkama. Koristiti probati, osim, i konačno blokove za hvatanje prilagođenih iznimaka i poduzimanje odgovarajućih radnji.

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 taj način možete obraditi sve oblike pokrenutih prilagođenih iznimaka.

Ako se dogodi iznimka tijekom izvođenja a probati blok, odgovarajući osim blok može uhvatiti i rukovati njime. Ako nema odgovarajućeg osim blok za obradu iznimke, bilo koji konačno blok će se izvršiti, nakon čega će se ponovno pokrenuti iznimka. Koristi konačno blok primarno za izvođenje zadataka čišćenja koji se moraju izvoditi u bilo kojim okolnostima, bez obzira na to dogodi li se iznimka ili ne.

try:
raise KeyboardInterrupt
except MyCustomError as err:
print(f"Error: {err}")
finally:
print("Did not Handle the KeyboardInterrupt Error. \
Can Only Handle MyCustomError")

U ovom uzorku, a KeyboardInterrupt događa se iznimka, ali osim blok samo ručke MyCustomError iznimke. U ovom slučaju, konačno blok se pokreće, a zatim se neobrađena iznimka ponovno pokreće.

Nasljeđivanje prilagođenih klasa pogrešaka

Bazirano na koncept objektno orijentiranog programiranja (OOP), također možete naslijediti od prilagođenih klasa izuzetaka, baš kao i obične klase. Nasljeđujući iz prilagođene klase iznimke, možete stvoriti klase pogrešaka koje daju specifičniji kontekst iznimci. Ovaj vam pristup omogućuje rukovanje pogreškama na različitim razinama u vašem kodu i pruža bolje razumijevanje uzroka pogreške.

Recimo da razvijate web aplikaciju koja je u interakciji s vanjskim API-jem. Ovaj API može imati različite scenarije pogreške. Htjet ćete postupati s tim pogreškama dosljedno i jasno u svom kodu. Da biste to postigli, stvorite prilagođenu klasu iznimke, BaseAPIException:

classBaseAPIException(Exception):
Base class for API-related exceptions.
def__init__(self, message):
super().__init__(message)
self.message = message

Nakon što imate ovu osnovnu prilagođenu klasu iznimke, možete stvoriti podređene klase iznimke koje nasljeđuju od nje:

classAPINotFoundError(BaseAPIException):
Raised when the requested resource is not found in the API.
pass

classAPIAuthenticationError(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

Podignite i uhvatite ove prilagođene iznimke prilikom upućivanja poziva API-ju unutar vaše web aplikacije. U skladu s njima postupajte koristeći odgovarajuću logiku u svom kodu.

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}")

Posljednja klauzula osim provjerava roditeljsku klasu i djeluje kao prihvat svih drugih grešaka povezanih s API-jem.

Kada naslijedite prilagođene klase izuzetaka, možete učinkovito rješavati pogreške unutar API-ja. Ovaj vam pristup omogućuje odvajanje obrade pogrešaka od detalja implementacije API-ja, olakšavajući dodavanje prilagođenih iznimaka ili unošenje promjena kako se API razvija ili nailazi na novu pogrešku slučajeva.

Omotavanje prilagođenih iznimaka

Zamotati iznimke znači uhvatiti iznimku, enkapsulirati je unutar prilagođene iznimke, a zatim pokrenuti tu prilagođenu iznimku uz pozivanje na izvornu iznimku kao uzrok. Ova tehnika pomaže pružiti kontekst porukama o pogreškama i drži detalje implementacije skrivenima od pozivnog koda.

Razmotrite scenarij u kojem vaša web-aplikacija komunicira s API-jem. Ako API podigne a LookupError, možete ga uhvatiti, a zatim podići običaj APINotFoundError iznimka koja kao uzrok navodi 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__}")

Koristi iz klauzula s podići izjava za pozivanje na izvornu iznimku unutar vaše prilagođene iznimke.

Kada se dogodi prilagođena iznimka, ona uključuje izvornu iznimku kao a __uzrok__ atribut, pružajući vezu između prilagođene iznimke i izvornika. To vam omogućuje da pratite porijeklo iznimke.

Umotavanjem iznimaka možete pružiti smisleniji kontekst i slati prikladnije poruke o pogrešci korisnicima, bez otkrivanja pojedinosti interne implementacije vašeg koda ili API-ja. Također vam omogućuje upravljanje i rješavanje vrsta pogrešaka na strukturiran i ujednačen način.

Prilagodba ponašanja klase u Pythonu

Nasljeđujući osnovnu klasu iznimke koju pruža Python, možete stvoriti jednostavne i korisne iznimke koje možete pokrenuti kada se u vašem kodu pojave određene pogreške. Također možete implementirati prilagođeno ponašanje za svoje klase izuzetaka uz pomoć magičnih ili dunder metoda.