Construcția try...except...finally.
În programarea cu Python, ne putem confrunta cu două tipuri de erori. Primul tip este reprezentat de erorile de sintaxă (syntax error). Acestea apar atunci când sintaxa limbajului de programare este încălcată în timpul scrierii codului sursă. În cadrul unor medii de dezvoltare, cum ar fi PyCharm, IDE-ul poate detecta automat erorile de sintaxă și le poate evidenția în vreun fel.
Al doilea tip de erori este reprezentat de erorile de execuție (runtime error). Acestea apar în timpul rulării programului. Aceste erori sunt numite și excepții. De exemplu, în lecțiile anterioare am discutat despre conversia unui șir de caractere într-un număr:
string = "5"
number = int(string)
print(number)
Acest script va rula cu succes, deoarece șirul "5" poate fi convertit într-un număr. Însă să luăm un alt exemplu:
string = "hello"
number = int(string)
print(number)
La rularea acestui script, va fi generată o excepție ValueError, deoarece șirul "hello" nu poate fi transformat într-un număr:
ValueError: invalid literal for int() with base 10: 'hello'
Pe de o parte, este evident că șirul nu reprezintă un număr, dar putem avea de-a face cu introducerea utilizatorului, care poate introduce și altceva decât ne așteptăm:
string = input("Introduceți un număr: ")
number = int(string)
print(number)
Când apare o excepție, execuția programului este întreruptă, iar pentru a evita acest comportament și a gestiona excepțiile în Python, se folosește construcția try..except.
try..except
Construcția try..except are următoarea definiție formală:
try:
instrucțiuni
except [Tip_excepție]:
instrucțiuni
Întregul cod principal, în care potențial poate apărea o excepție, este plasat după cuvântul-cheie try. Dacă în acest cod se generează o excepție, execuția codului din blocul try este întreruptă, iar execuția trece la blocul except.
După cuvântul-cheie except, opțional, se poate specifica ce tip de excepție va fi tratată (de exemplu, ValueError sau KeyError). După cuvântul except, pe linia următoare se află instrucțiunile blocului except, care se execută în caz de apariție a excepției.
Să analizăm tratarea unei excepții pe exemplul conversiei unui șir într-un număr:
try:
number = int(input("Introduceți un număr: "))
print("Numărul introdus:", number)
except:
print("Conversia a eșuat")
print("Finalizarea programului")
Introducând un șir:
plaintext
Introduceți un număr: hello
Conversia a eșuat
Finalizarea programului
După cum se poate vedea din afișarea pe consolă, la introducerea unui șir, afișarea numărului pe consolă nu are loc, iar execuția programului trece la blocul except.
Introducând un număr corect:
Introduceți un număr: 22
Numărul introdus: 22
Finalizarea programului
Acum totul se execută normal, excepția nu apare, iar blocul except nu este executat.
Blocul finally
La tratarea excepțiilor, se poate folosi și blocul opțional finally. Particularitatea acestui bloc este că se execută indiferent dacă a fost generată sau nu o excepție:
try:
number = int(input("Introduceți un număr: "))
print("Numărul introdus:", number)
except:
print("Conversia a eșuat")
finally:
print("Blocul try a finalizat execuția")
print("Finalizarea programului")
De obicei, blocul finally este utilizat pentru eliberarea resurselor utilizate, de exemplu, pentru închiderea fișierelor.
Este important de menționat că blocul finally nu tratează excepțiile, și dacă folosim acest bloc fără blocul except, atunci când apare o eroare, aplicația se va închide brusc, cum ar fi în cazul următor la împărțirea unui număr la zero:
try:
number = 3 / 0 # generează excepția ZeroDivisionError
print(number)
finally:
print("Blocul try a finalizat execuția")
print("Finalizarea programului")