Tratarea erorilor
Construcția try..catch..finally
În timpul execuției programului, pot apărea diferite erori care perturbă fluxul normal al programului și, uneori, determină întreruperea execuției acestuia. Limbajul JavaScript dispune de instrumente pentru gestionarea acestor situații.
O situație simplă este apelarea unei funcții care nu există:
callSomeFunc();
console.log("Restul instrucțiunilor");
Aici se apelează funcția callSomeFunc(), care nu este definită nicăieri. Prin urmare, la apelul acestei funcții, ne confruntăm cu o eroare.
Uncaught ReferenceError: callSomeFunc is not defined
Toate celelalte instrucțiuni care urmează după linia unde apare eroarea nu sunt executate. Programul își încheie execuția.
Situația poate părea artificială, deoarece știm că funcția callSomeFunc nu este definită. Cu toate acestea, într-o programare extinsă, unde diferiți dezvoltatori au definit diferite părți ale programului, devine mai dificil să controlezi codul. Există multe situații în care unele erori pot fi anticipate și prevenite, iar altele nu.
Pentru gestionarea acestor situații, JavaScript furnizează construcția try...catch...finally, care are următoarea definiție formală:
try {
// instrucțiuni blocului try
}
catch (error) {
// instrucțiuni blocului catch
}
finally {
// instrucțiuni blocului finally
}
După operatorul try, se definește un bloc de cod. În acest bloc sunt plasate instrucțiunile pentru care poate apărea o eroare potențială în timpul execuției.
Următorul este operatorul catch. După acest operator, în paranteze rotunde, se specifică numele obiectului care va conține informații despre eroare. Apoi urmează blocul catch. Acest bloc este executat doar în cazul apariției unei erori în blocul try.
După blocul catch, urmează operatorul finally, cu propriul său bloc de instrucțiuni. Acest bloc este executat la sfârșitul blocurilor try și catch, indiferent dacă a apărut o eroare sau nu.
Este de remarcat faptul că doar blocul try este obligatoriu. Unul dintre celelalte blocuri - catch sau finally - poate fi omis. Cu toate acestea, unul dintre aceste blocuri (fie catch, fie finally) trebuie să fie prezent. Cu alte cuvinte, putem utiliza următoarele variante ale acestei construcții:
try...catch try...finally try...catch...finally
De exemplu, să gestionăm situația anterioară cu funcția care nu există folosind această construcție:
try {
callSomeFunc();
console.log("Sfârșitul blocului try");
}
catch {
console.log("A apărut o eroare!");
}
console.log("Celelalte instrucțiuni");
Astfel, mai întâi se execută blocul try. Cu toate acestea, în timpul executării primei instrucțiuni - apelul funcției callSomeFunc() - apare o eroare. Acest lucru duce la faptul că toate instrucțiunile ulterioare din blocul try NU vor fi executate.
Controlul se mută la blocul catch. În acest bloc se afișează un mesaj că a apărut o eroare. După executarea blocului catch, sunt efectuate celelalte instrucțiuni ale programului. Astfel, programul nu își întrerupe execuția în caz de eroare și își continuă activitatea.
A apărut o eroare! Alte instrucțiuni
Să luăm în considerare un alt exemplu:
function callSomeFunc() { console.log("Funcția callSomeFunc"); }
try {
callSomeFunc();
console.log("Sfârșitul blocului try");
} catch (error) {
console.log("A apărut o eroare!");
}
console.log("Alte instrucțiuni");
Acum funcția callSomeFunc() este definită în program, astfel încât la apelarea funcției nu va apărea nicio eroare, iar blocul try va continua să se execute până la sfârșit. În absența unei erori, blocul catch nu va fi executat. Output-ul în consolă va fi următorul:
Funcția callSomeFunc Sfârșitul blocului try Alte instrucțiuni
Obținerea unei erori în blocul catch
În calitate de parametru pentru blocul catch, este furnizat un obiect cu informații despre eroare.
try {
callSomeFunc();
console.log("Sfârșitul blocului try");
} catch (eroare) {
console.log("A apărut o eroare!");
console.log(eroare);
}
În acest caz, vom obține un output în consolă similar cu următorul:
A apărut o eroare!
ReferenceError: callSomeFunc is not defined
at index.html:35
Bloc finally
Construcția try poate include și un bloc finally. Acest bloc poate fi utilizat împreună cu blocul catch sau în locul acestuia. Blocul finally se execută indiferent dacă apare o eroare sau nu. De exemplu:
try {
callSomeFunc();
console.log("Sfârșitul blocului try");
} catch {
console.log("A apărut o eroare");
} finally {
console.log("Bloc finally");
}
console.log("Alte instrucțiuni");
Output-ul în consolă al programului ar fi:
A apărut o eroare
Bloc finally
Alte instrucțiuni
Dacă eliminăm blocul catch și lăsăm doar blocul finally, eroarea nu va fi gestionată, iar programul se va încheia cu o eroare. Cu toate acestea, blocul finally va fi totuși executat:
try {
callSomeFunc();
console.log("Sfârșitul blocului try");
} finally {
console.log("Bloc finally");
}
console.log("Alte instrucțiuni");
Output-ul în consolă al programului ar fi:
Bloc finally
Uncaught ReferenceError: callSomeFunc is not defined