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ă
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 interiorultry.
Prinderea mesajului de excepție
Utilizați as pentru a lega obiectul excepție la un nume:
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ă
try:
valore = dati[chiave]
except (KeyError, IndexError):
valore = NoneUn tuplu de tipuri prinde orice excepție a acestor tipuri (sau subclase).
Structura completă: încercați / cu excepția / altfel / în sfârșit
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 exceptionelse— folosește-l pentru cod care depinde de succesultry. 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:
def diviso(a, b):
if b == 0:
raise ValueError("the divisor cannot be zero")
return a / bCele 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ă blocultryse 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
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”.
Afișează indiciu
int('abc') generează ValueError.
Soluție disponibilă după 3 încercări
Exercițiu de revizuire
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.
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ă
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\`.
Afișează indiciu
Utilizați try: result = int(text_val) urmat de except ValueError: result = None.
Soluție disponibilă după 3 încercări