Excepțiile sunt o modalitate puternică și grațioasă de a gestiona erorile din programele dvs. Python. Excepțiile personalizate duc această putere la un nou nivel.
Clasele de excepție încorporate din Python nu abordează anumite situații de eroare care pot apărea în codul dvs. În astfel de cazuri, va trebui să creați excepții personalizate pentru a gestiona aceste erori în mod eficient.
În Python, puteți defini excepții personalizate și le puteți ridica atunci când apar anumite situații de eroare. Puteți gestiona erori specifice, informative, cu excepții personalizate, îmbunătățind lizibilitatea și mentenabilitatea codului dvs.
De ce aveți nevoie de excepții personalizate?
În timpul dezvoltării unei aplicații, pot apărea diverse scenarii de eroare din cauza modificărilor codului, integrării cu alte pachete sau biblioteci și interacțiunilor cu aplicații externe. Este esențial să gestionați aceste erori pentru a vă recupera sau a gestiona eșecul cu grație.
Python oferă o gamă de excepție încorporată
clase care acoperă erori precum ValueError, Eroare de scris, FileNotFoundError, și altele. Deși aceste excepții încorporate își servesc bine scopul, ele pot reprezenta doar uneori cu exactitate erorile care pot apărea în aplicația dvs.Prin crearea de excepții personalizate, le puteți personaliza în mod special pentru a se potrivi cerințelor aplicației dvs. și puteți oferi informații dezvoltatorilor care vă folosesc codul.
Cum să definiți excepțiile personalizate
Pentru a crea excepții personalizate, definiți o clasă Python care moștenește de la Clasa de excepție. The Excepție clasa oferă funcționalități de bază de care veți avea nevoie pentru a gestiona excepțiile și o puteți personaliza pentru a adăuga funcții în funcție de nevoile dvs. specifice.
Când creați clase de excepții personalizate, păstrați-le simple, incluzând atributele necesare pentru stocarea informațiilor despre erori. Administratorii de excepții pot accesa apoi aceste atribute pentru a gestiona erorile în mod corespunzător.
Iată o clasă de excepție personalizată, MyCustomError:
classMyCustomError(Exception):
def__init__(self, message=None):
self.message = message
super().__init__(message)
Această clasă acceptă un argument de mesaj opțional în timpul inițializării. Acesta folosește super() metoda de a apela constructorul bazei Excepție clasa, care este esențială pentru gestionarea excepțiilor.
Cum să ridicați excepții personalizate
Pentru a genera o eroare, utilizați a ridica cuvânt cheie urmat de o instanță a clasei de excepție personalizată, trecându-i un mesaj de eroare ca argument:
ifTrue:
raise MyCustomError("A Custom Error Was Raised...")
De asemenea, puteți ridica eroarea fără a transmite niciun argument:
ifTrue:
raise MyCustomError # shorthand
Oricare format este potrivit pentru ridicarea erorilor personalizate.
Cum să gestionați excepțiile personalizate
Gestionarea excepțiilor personalizate urmează aceeași abordare ca și gestionarea excepțiilor încorporate. Utilizare încerca, cu exceptia, și in cele din urma blocuri pentru a captura excepții personalizate și pentru a lua măsurile corespunzătoare.
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")
În acest fel, puteți gestiona toate formele de excepții personalizate ridicate.
Dacă apare o excepție în timpul executării a încerca bloc, o corespondență cu exceptia blocul îl poate prinde și manevra. Dacă nu există nici un adecvat cu exceptia bloc pentru a gestiona excepția, orice in cele din urma blocul se va executa, urmat de ridicarea excepției din nou. Folosește o in cele din urma blocați în primul rând pentru a efectua sarcini de curățare care trebuie să ruleze în orice circumstanțe, indiferent dacă apare sau nu o excepție.
try:
raise KeyboardInterrupt
except MyCustomError as err:
print(f"Error: {err}")
finally:
print("Did not Handle the KeyboardInterrupt Error. \
Can Only Handle MyCustomError")
În această probă, a KeyboardInterrupt apare o excepție, dar cu exceptia blocați numai mânerele MyCustomError excepții. În acest caz, in cele din urma blocul rulează, iar apoi excepția netratată se ridică din nou.
Moștenirea claselor de eroare personalizate
Bazat pe conceptul de programare orientată pe obiecte (OOP), puteți, de asemenea, să moșteniți din clase de excepție personalizate, la fel ca și clasele obișnuite. Prin moștenirea dintr-o clasă de excepție personalizată, puteți crea clase de eroare care oferă un context mai specific unei excepții. Această abordare vă permite să gestionați erorile la diferite niveluri din codul dvs. și oferă o mai bună înțelegere a cauzei erorii.
Să presupunem că dezvoltați o aplicație web care interacționează cu un API extern. Acest API poate avea scenarii de eroare diferite. Veți dori să gestionați aceste erori în mod consecvent și clar pe tot parcursul codului. Pentru a realiza acest lucru, creați o clasă de excepție personalizată, BaseAPIException:
classBaseAPIException(Exception):
Base class for API-related exceptions.
def__init__(self, message):
super().__init__(message)
self.message = message
Odată ce aveți această clasă de excepție personalizată de bază, puteți crea clase de excepție copil care moștenesc de la ea:
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
Ridicați și identificați aceste excepții personalizate atunci când efectuați apeluri către API în cadrul aplicației dvs. web. Gestionați-le în consecință folosind logica adecvată din codul dvs.
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}")
Clauza finală cu excepția verifică în raport cu clasa părinte și acționează ca un remediu pentru orice alte erori legate de API.
Când moșteniți clase de excepții personalizate, puteți gestiona eficient erorile din API. Această abordare vă permite să separați gestionarea erorilor de detaliile de implementare a API-ului, facilitând adăugarea de excepții personalizate sau efectuarea modificărilor pe măsură ce API-ul evoluează sau întâlnește noi erori cazuri.
Încheierea excepțiilor personalizate
A include excepții înseamnă a captura o excepție, a o încapsulați într-o excepție personalizată și apoi a ridica acea excepție personalizată în timp ce faceți referire la excepția inițială ca cauză. Această tehnică ajută la furnizarea contextului mesajelor de eroare și păstrează detaliile de implementare ascunse de codul de apelare.
Luați în considerare scenariul în care aplicația dvs. web interacționează cu un API. Dacă API-ul ridică a LookupError, poți să-l prinzi, apoi să ridici un obicei APInotFoundError excepție care face referire la LookupError ca cauză:
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__}")
Folosește o din clauza cu a ridica declarație pentru a face referire la excepția originală din excepția personalizată.
Când apare excepția personalizată, aceasta include excepția originală ca a __cauză__ atribut, oferind o legătură între excepția personalizată și originalul. Acest lucru vă permite să urmăriți originea unei excepții.
Prin includerea excepțiilor, puteți oferi un context mai semnificativ și puteți trimite mesaje de eroare mai adecvate utilizatorilor, fără a dezvălui detaliile interne de implementare ale codului dvs. sau ale API-ului. De asemenea, vă permite să gestionați și să abordați tipurile de erori într-un mod structurat și uniform.
Personalizarea comportamentului clasei în Python
Prin moștenirea clasei de excepție de bază pe care o oferă Python, puteți crea excepții simple și utile pe care le puteți ridica atunci când apar anumite erori în codul dvs. De asemenea, puteți implementa un comportament personalizat pentru clasele dvs. de excepție cu ajutorul metodelor magice sau dunder.