Salt la conținutul principal
Modulul 2 · Lecția 4 din 48/36 în curs~12 min
Lecții din modul (4/4)

Gestionarea erorilor: încercați/cu excepția

Când ceva nu merge bine în timpul execuției (o împărțire cu zero, o cheie lipsă, an operație pe tipuri incompatibile) Python ridică o excepție. Fără manipulare, excepția întrerupe programul. Cu try / except dvs. poate să-l prindă și să decidă ce să facă.

Forma de bază

Python
try:
    risultato = 10 / 0
except ZeroDivisionError:
    risultato = None
risultato  # None
  • blocul try: conține codul care poate eșua;
  • except <ErrorType>: este executat numai dacă acel tip de eroare este ridicat în interiorul try.

Prinderea mesajului de excepție

Utilizați as pentru a lega obiectul excepție la un nume:

Python
try:
    int("non è un numero")
except ValueError as e:
    messaggio = str(e)
messaggio  # "invalid literal for int() with base 10: 'non è un numero'"

Mai multe tipuri împreună

Python
try:
    valore = dati[chiave]
except (KeyError, IndexError):
    valore = None

Un tuplu de tipuri prinde orice excepție a acestor tipuri (sau subclase).

Structura completă: încercați / cu excepția / altfel / în sfârșit

Python
try:
    n = int("42")
except ValueError:
    print("not a number")
else:
    print(f"parsed: {n}")     # executed only if NO exception occurred
finally:
    print("always executed")  # executed regardless, even on exception
  • else — folosește-l pentru cod care depinde de succesul try. Păstrează-l separați astfel încât să nu prindeți accidental excepții care nu au legătură.
  • finally — curățare care trebuie să aibă loc întotdeauna (închiderea unui fișier, eliberarea unui resursă). Efectuat atât la succes, cât și la eroare.

Se ridică o excepție: raise

Uneori, tu ești cel care vrea să semnalizeze că ceva a mers prost:

Python
def diviso(a, b):
    if b == 0:
        raise ValueError("the divisor cannot be zero")
    return a / b

Cele mai frecvente excepții încorporate pe care le veți întâlni și le veți ridica:

  • ValueError — valoarea are tipul potrivit, dar este inacceptabilă (de exemplu, analiza).
  • TypeError — tipul este greșit (de exemplu, len(42)).
  • KeyError / IndexError — lipsește cheia/indexul.
  • ZeroDivisionError — împărțire la zero.
  • FileNotFoundError, PermissionError — operațiuni ale sistemului de fișiere.

Clauzele else și final din blocurile try

Un bloc try poate defini două clauze suplimentare:

  • else: executat numai dacă blocul try se finalizează fără a ridica excepții.
  • finally: executat întotdeauna, indiferent dacă a apărut o excepție. Acest lucru este ideal pentru curățarea resurselor (de exemplu, închiderea unui fișier deschis sau a conexiunii la baza de date).

Încercați-l singur

Exercițiu#python.m2.l4.e1
Încercări: 0Se încarcă…

Scrieți o expresie care încearcă int('abc'): dacă ValueError este ridicată, atribuiți șirul 'errore' la `result`; altfel atribuiți numărul. Evaluați „rezultatul”.

Se încarcă editorul...
Afișează indiciu

int('abc') generează ValueError.

Soluție disponibilă după 3 încercări

Exercițiu de revizuire

Exercițiu#python.m2.l4.e2
Încercări: 0Se încarcă…

Definiți `divide(a, b)` care returnează a/b, dar ridică ValueError cu mesajul 'divisore zero' dacă b este 0. Apoi apelați divide(10, 0) în interiorul unui try/except și atribuiți lui `message` șirul excepției capturate.

Se încarcă editorul...
Afișează indiciu

ridică ValueError('...') în interiorul funcției; prinde cu excepția ValueError ca e.

Soluție disponibilă după 3 încercări

Provocare suplimentară

Exercițiu#python.m2.l4.e3
Încercări: 0Se încarcă…

Scrieți un bloc \`try-except\` pentru a converti șirul \`text_val = "abc"\` într-un număr întreg. Dacă conversia generează o \`ValueError\`, atribuiți \`Niciuna\` la \`rezultat\`. În caz contrar, atribuiți numărul convertit. În cele din urmă, evaluați \`rezultatul\`.

Se încarcă editorul...
Afișează indiciu

Utilizați try: result = int(text_val) urmat de except ValueError: result = None.

Soluție disponibilă după 3 încercări