Excepțiile definite de utilizator sunt create prin definirea unei noi clase de la care moștenește Excepție încorporată în Python clasa sau una dintre subclasele sale. Făcând acest lucru, putem crea mesaje de eroare personalizate și putem gestiona erori specifice într-un mod care are sens pentru aplicația noastră.
Pași pentru a crea și utiliza excepții definite de utilizator
Urmați acești pași pentru a crea și utiliza excepții definite de utilizator în Python:
- Definiți o nouă clasă de excepție: Creați o nouă clasă care moștenește din Exception sau din oricare dintre subclasele sale.
- Ridicați excepția: Utilizați instrucțiunea de ridicare pentru a ridica excepția definită de utilizator atunci când apare o anumită condiție.
- Gestionați excepția: Utilizați blocurile try-except pentru a gestiona excepția definită de utilizator.
Exemplu: În acest exemplu, creăm o excepție personalizată InvalidAgeError pentru a ne asigura că valorile vârstei se încadrează într-un interval valid (0–120).
Python# Step 1: Define a custom exception class class InvalidAgeError(Exception): def __init__(self age msg='Age must be between 0 and 120'): self.age = age self.msg = msg super().__init__(self.msg) def __str__(self): return f'{self.age} -> {self.msg}' # Step 2: Use the custom exception in your code def set_age(age): if age < 0 or age > 120: raise InvalidAgeError(age) else: print(f'Age set to: {age}') # Step 3: Handling the custom exception try: set_age(150) # This will raise the custom exception except InvalidAgeError as e: print(e)
Ieșire
150 -> Age must be between 0 and 120
Explicaţie:
- Clasa InvalidAgeError moștenește de la Exception. Acesta definește o __fierbinte__ metoda de a accepta vârsta și mesajul.
- Metoda __str__ returnează o reprezentare șir lizibilă a erorii.
- În set_age() dacă vârsta este în afara intervalului valid (0–120), excepția este ridicată.
- Blocul try-except prinde excepția și tipărește mesajul de eroare.
Personalizarea claselor de excepție
Când creăm o excepție personalizată, subclasăm clasa de excepție încorporată a lui Python (sau o subclasă precum ValueError TypeError etc.). Apoi putem adăuga propriile noastre metode de atribute sau logica personalizată pentru a face excepția noastră mai informativă.
python __dict__
De asemenea, putem îmbunătăți excepțiile personalizate prin adăugarea de atribute suplimentare sau metode de suprascrie.
Exemplu: Aici îmbunătățim InvalidAgeError adăugând un cod de eroare și personalizând mesajul de eroare.
Pythonclass InvalidAgeError(Exception): def __init__(self age msg='Age must be between 0 and 120' error_code=1001): self.age = age self.msg = msg self.error_code = error_code super().__init__(self.msg) def __str__(self): return f'[Error Code {self.error_code}] {self.age} -> {self.msg}' try: set_age(150) # This will raise the custom exception except InvalidAgeError as e: print(e)
Ieșire
[Error Code 1001] 150 -> Age must be between 0 and 120
Explicaţie:
traversarea în ordine a arborilor
- InvalidAgeError are acum un atribut suplimentar error_code.
- Metoda __str__ este suprascrisă pentru a afișa atât codul de eroare, cât și vârsta.
- Când set_age(150) este executat, excepția este ridicată și prinsă în blocul try-except.
- Mesajul de eroare personalizat este tipărit, făcând eroarea mai descriptivă.
Utilizarea excepțiilor standard ca clasă de bază
Uneori, în loc să moștenim direct de la Exception, putem crea o excepție personalizată prin subclasificarea unei excepții standard, cum ar fi RuntimeError ValueError etc. Acest lucru este util atunci când excepția personalizată ar trebui tratată ca un anumit tip de eroare.
Exemplu: Acest exemplu arată cum să creați o excepție personalizată NetworkError prin moștenirea de la RuntimeError, care este o excepție standard încorporată.
Python# NetworkError has base RuntimeError and not Exception class NetworkError(RuntimeError): def __init__(self arg): self.args = (arg) # store as tuple try: raise NetworkError('Connection failed') except NetworkError as e: print(e.args)
Ieșire
('Connection failed') Explicaţie:
- NetworkError moștenește de la RuntimeError, care este un tip de excepție încorporat.
- Când este ridicat, mesajul este stocat în atributul args ca tuplu.
- Excepția este capturată și sunt afișate argumentele ei stocate.
Exemplu real: eroare de e-mail nevalidă
Iată un exemplu simplu în care ridicăm o excepție personalizată dacă adresa de e-mail nu este validă:
Pythonclass InvalidEmailError(Exception): def __init__(self email msg='Invalid email format'): self.email = email self.msg = msg super().__init__(self.msg) def __str__(self): return f'{self.email} -> {self.msg}' def set_email(email): if '@' not in email: raise InvalidEmailError(email) print(f'Email set to: {email}') try: set_email('userexample.com') except InvalidEmailError as e: print(e)
Ieșire
userexample.com -> Invalid email format
Explicaţie:
- O nouă clasă de excepție InvalidEmailError este definită pentru a valida adresele de e-mail.
- Dacă e-mailul dat nu conține „@”, excepția este ridicată.
- Blocul try-except prinde eroarea și tipărește mesajul formatat.
Când să folosiți excepțiile definite de utilizator?
Excepțiile definite de utilizator ar trebui luate în considerare în următoarele scenarii:
- Reprezentând erori specifice într-o aplicație (de exemplu, InvalidAgeError DatabaseConnectionError).
- Furnizarea de mesaje de eroare mai clare și mai descriptive.
- Gestionarea separată a unui grup de erori asociate folosind except.
Prin utilizarea excepțiilor definite de utilizator, programele devin mai lizibile, mai ușor de întreținut și mai ușor de depanat.