Gestionarea excepțiilor în Python este esențială pentru a preveni blocarea frecventă a programelor tale. Această practică îmbunătățește fiabilitatea codului și oferă o experiență superioară utilizatorilor. În acest articol, vom explora cum să prinzi mai multe tipuri de excepții folosind același bloc try/except în Python.
Ce sunt excepțiile în Python?
În Python, excepțiile reprezintă un mecanism de comunicare vital între diverse segmente ale unui program. Acest mecanism permite unei componente să semnalizeze că a întâmpinat o problemă critică, pe care nu o poate rezolva singură.
Astfel, se lansează o excepție. O altă parte a programului, capabilă să gestioneze această problemă, va prelua controlul și va trata eroarea în mod corespunzător.
În absența unei gestionări corespunzătoare, excepțiile pot duce la blocarea programului. Prin urmare, tratarea excepțiilor este crucială pentru a asigura stabilitatea și fiabilitatea programului.
Pentru scopul acestui articol, se presupune că ești familiarizat cu noțiunile de bază ale lansării și tratării excepțiilor, detalii pe care le găsești în articolul Introducere în Python Try/Except.
De ce este importantă gestionarea mai multor excepții în Python?
- Reduce repetiția codului, deoarece mai multe excepții sunt tratate de același bloc. Acest lucru îmbunătățește lizibilitatea, editarea și eliminarea codului.
- Permite scrierea unui cod mai eficient, deoarece tipul de eroare este verificat o singură dată, nu de mai multe ori.
Gestionarea mai multor excepții
Capturarea mai multor excepții se referă la situația în care un singur bloc except este folosit pentru a gestiona diverse tipuri de erori. În Python, poți prinde excepții individual, folosind blocuri except separate.
Alternativ, atunci când vrei să tratezi excepții similare într-un mod similar, le poți gestiona folosind un singur bloc. Pentru aceasta, va trebui să prinzi mai multe excepții. În continuare, vom vedea cum se realizează acest lucru printr-un exemplu practic.
#1. Prinderea diferitelor excepții în blocuri separate
Să presupunem că avem un program care primește două valori și le împarte. În acest scenariu, ne așteptăm să apară diferite tipuri de excepții atunci când utilizatorul introduce valori invalide. În mod specific, dorim să gestionăm excepțiile ValueError și ZeroDivisionError.
ValueError se va declanșa atunci când utilizatorul introduce o valoare care nu poate fi convertită într-un număr întreg. ZeroDivisionError va apărea atunci când al doilea număr este zero. În ambele cazuri, dorim să afișăm un mesaj de eroare care să informeze utilizatorul că a introdus o valoare incorectă.
Pentru a realiza acest lucru, am putea scrie următorul cod:
try: dividend = int(input('Introdu primul număr: ')) divisor = int(input('Introdu al doilea număr: ')) quotient = dividend / divisor print(quotient) except ValueError as e: print("Ai introdus o valoare invalidă") except ZeroDivisionError as e: print("Ai introdus o valoare invalidă") except Exception as e: print("Ceva a mers greșit")
Dacă rulăm codul și introducem un text care nu poate fi convertit într-un număr întreg, vom obține următorul rezultat:
Și dacă introducem 0 ca al doilea număr, vom vedea:
Codul funcționează conform așteptărilor, dar observăm că tratăm ValueError și ZeroDivisionError în mod similar. Astfel, avem o repetare semnificativă de cod între cele două blocuri except. Acest lucru nu este ideal, deoarece încalcă principiul DRY (Don’t Repeat Yourself) din programare.
În loc să scriem cod separat, putem combina cele două blocuri într-unul singur, care gestionează mai multe excepții. Astfel, vom evita repetarea codului.
#2. Gestionarea mai multor excepții într-un singur bloc except
Pentru a prinde mai multe excepții, vom specifica un tuplu care include toate erorile pe care dorim să le gestionăm. Iată un exemplu în care prindem atât ValueError, cât și ZeroDivisionError, folosind un singur bloc except:
try: dividend = int(input('Introdu primul număr: ')) divisor = int(input('Introdu al doilea număr: ')) quotient = dividend / divisor print(quotient) except (ValueError, ZeroDivisionError) as e: print("Ai introdus o valoare invalidă") except Exception as e: print("Ceva a mers greșit")
Aceasta este o abordare mult mai eficientă comparativ cu codul anterior. Aceasta este, în esență, gestionarea mai multor excepții. Codul de mai sus funcționează exact ca înainte. Dacă îl testezi folosind exemplele anterioare, vei obține aceleași rezultate:
#3. Identificarea excepției care a fost prinsă
Codul anterior execută primul bloc except atunci când este prinsă fie o ValueError, fie o ZeroDivisionError. În anumite situații, este posibil să dorești să execuți același cod pentru ambele erori, dar și un cod specific pentru fiecare dintre ele.
În acest caz, trebuie să identifici mai întâi ce tip de eroare a fost capturată și să execuți codul corespunzător.
Pentru a identifica tipul excepției, poți utiliza un bloc if/else în interiorul blocului except. De exemplu:
try: dividend = int(input('Introdu primul număr: ')) divisor = int(input('Introdu al doilea număr: ')) quotient = dividend / divisor print(quotient) except (ValueError, ZeroDivisionError) as e: print("Ai introdus o valoare invalidă") if isinstance(e, ValueError): print('Eroare de valoare') else: print('Eroare de împărțire la zero') except Exception as e: print("Ceva a mers greșit")
În acest bloc, pe lângă afișarea mesajului generic de eroare pentru ambele tipuri de excepții, verificăm exact ce tip de eroare a fost prinsă și afișăm un mesaj suplimentar. Dacă rulăm codul din nou, vom vedea câteva mesaje specifice excepției capturate.
Când ar trebui să gestionezi mai multe excepții?
În general, gestionarea mai multor excepții este ideală atunci când vrei să execuți același cod pentru erori similare, care ar putea apărea. Acest lucru include:
- Cereri de rețea care au eșuat din diverse motive. Indiferent de motiv, poate dorești să notifici utilizatorul că serverul nu a putut fi contactat.
- Conexiuni la bazele de date eșuate, care pot produce mai multe tipuri de erori. Deși aceste erori pot fi diferite, modul în care le gestionezi poate fi același.
- Operațiunile de citire/scriere a fișierelor pot genera, de asemenea, erori care pot fi tratate similar, cum ar fi erorile de permisiune sau de spațiu insuficient pe disc.
Concluzie
Acest articol a prezentat modalitatea de a combina mai multe blocuri except într-unul singur, prin capturarea mai multor excepții simultan. Acest lucru contribuie la un cod mai ușor de citit și întreținut. Pentru a continua să înveți, îți recomandăm să citești articolul despre proiectele Python pentru începători.