Tratarea excepțiilor

În timpul executării programului, pot apare anumite situații care altereaza desfășurarea normală a acestuia. Când apare o astfel de situație, de regulă, se generează o excepție sau o eroare prin care se semnalează incidentul care a avut loc. Excepțiile și erorile pot fi generate atât de echipamente (excepții sau erori hardware), cât și de programe (excepții software). Exemple de excepții hardware pot fi întreruperile, excepția de împărțire la zero, unele incidente din subsistemele de intrare/ieșire etc. Excepțiile software sunt mult mai diverse, depinzând de specificul programelor care le generează. Deosebirea dintre excepții și erori este că excepțiile sunt considerate că pot fi tratate prin program, în timp ce erorile sunt considerate mai curând nerecuperabile.
 
În programul din fișierul TestExcept1.java se testează apariția unei excepții de împărțire la zero. Întrucât variabila b are valoarea zero, la executarea împărțirii a/b procesorul calculatorului generează o excepție aritmetică. Întrucât în programul nostru nu există instrucțiuni prin care să se trateze această excepție, programul se întrerupe, trecându-se controlul asupra sistemului de operare al calculatorului, iar acesta afișeaza excepția survenită și oprește executarea programului. 

În limbajul Java, există posibilitatea de a se trata prin program diferitele excepții care apar în timpul execuției. În acest fel, programatorul poate să prevadă căi alternative de continuare a executării programului, fără a mai fi necesară oprirea executării lui. În mediul de lucru Java, la apariția unei excepții se generează un obiect special numit excepție, care conține informația despre excepția respectivă. Acest obiect poate fi captat prin program, iar informația conținută în el poate fi utilizată pentru a decide calea pe care se va merge în continuare în derularea programului. Toate obiectele de excepție care se referă la același tip de incident formează o clasă de excepții.

Tratarea prin program a excepțiilor se face, în limbajul Java, folosind instrucțiunea  try urmată de una sau mai multe clauze  catch și, opțional, de o clauză  finally sub forma urmatoare:
    try {
           secventa
        }
        catch (ClasaExceptie1variabila1) {
          secventa1
        }
        catch (ClasaExceptie2 variabila2) {
          secventa2
        }
       ...............
        catch (ClasaExceptieN variabilaN) {
          secventaN
        }
       [finally {
           secventa_finalizatoare
       }]

În engleza, try înseamnă încearcă, iar catch înseamnă prinde. În corpul instrucțiunii try se pune secvența de instrucțiuni în care este posibil ca, la executarea programului, să apară excepții. Dacă excepția a apărut într-un punct situat în corpul unei instrucțiuni try, aceasta instrucțiune se termină în mod abrupt, astfel că restul instrucțiunilor nu se mai execută, trecându-se direct la acolada de închidere a blocului. Se parcurg apoi, una după alta, clauzele catch, până se ajunge la cea care are între paranteze numele clasei excepției care s-a produs și se execută secvența din corpul acestei clauze.

Clauza finally este opțională și conține o secvență de instructiuni care se vor executa în final, adică după ce a fost tratată excepția prin una din clauzele catch, sau dacă nu a fost tratată prin nici una dintre acestea.
 
Exemplul 1: În fișierul TestExcept2.java  este dată o modificare a programului din fișierul TestExcept1.java, în care excepția este tratată prin instrucțiunea try. Întrucât se știa că este posibilă apariția unei excepții aritmetice, s-a încercat să se capteze mai întai această excepție. Ca rezervă, s-a prevăzut și o clauza  catch pentru clasa Exception, care va capta orice alta excepție. Comparând rezultatele executării celor două programe menționate, constatăm că, atunci când s-au tratat excepțiile prin instrucțiunea try, programul nu a mai fost oprit anormal, ci s-a executat blocul clauzei catch(ArithmeticException e1), după care s-a continuat executarea normală a programului. În schimb, instrucțiunile existente în blocul try, după cea care a generat excepția, nu au mai fost executate. 

Exemplul 2: În fișierul TestExcept3.java  se reia programul din exemplul anterior, dar a fost suprimată prima din clauzele catch. Executând acest program, se poate observa că și de data aceasta excepția aritmetică a fost captata, însa de clauza catch(Exception e)

Exemplul 3: În fișierul TestExcept4.java se reia programul din Exemplul 1, dar după captarea excepției s-a introdus si clauza finally. Se observă ca secvența din aceasta clauză este executată chiar daca excepția a fost captată prin  catch.  Mai mult, în fișierul TestExcept5.java s-a reluat același program, dar s-a modificat valoarea numitorului fracției, astfel că nu mai are loc o împărțire la zero. Se observă ca secvența din clauza finallyeste executată și în acest caz. 



© Copyright 2000 - Severin BUMBARU, Universitatea "Dunărea de Jos" din Galați