Tratarea erorilor
try/catch/finally, throw corect, erori custom și când nu prinzi nimic.
Actualizat
Ce este o eroare
O eroare (excepție) e un semnal că ceva n-a mers și programul nu poate continua normal în acel punct. Când apare, JS oprește execuția funcției curente și „urcă” prin apeluri până găsește cineva care o prinde. Dacă nu o prinde nimeni → eroare în consolă, iar în React → ecranul de eroare.
O eroare e un obiect cu:
name— tipul (TypeError,HttpError);message— ce s-a întâmplat;stack— unde s-a întâmplat (lanțul de apeluri) — cea mai utilă informație la debugging;cause(opțional) — eroarea originală care a provocat-o.
Tipuri de erori native
| Tip | Când apare | Exemplu |
|---|---|---|
TypeError |
operație pe tipul greșit | undefined.name, 5() |
ReferenceError |
variabilă inexistentă / în TDZ | folosești x nedeclarat |
SyntaxError |
cod invalid sau JSON invalid | JSON.parse('{nope') |
RangeError |
valoare în afara limitelor | new Array(-1) |
Erori așteptate vs neașteptate
Distincția cea mai importantă:
| Așteptate | Neașteptate | |
|---|---|---|
| Exemple | email invalid, produs lipsă din stoc, 404 | bug, server picat, undefined.x |
| Cum le tratezi | valori returnate: { ok: false, error } |
excepții: throw |
| Cine le vede | userul, cu mesaj clar | logul / monitorizarea; userul vede un mesaj generic |
Validarea unui formular nu e „excepțională” — e normal ca userul să greșească. Returnează un rezultat, nu arunca.
try / catch / finally
try {
const data = JSON.parse(raw) // cod care poate arunca
render(data)
} catch (error) {
showToast('Date invalide') // rulează doar dacă a apărut o eroare
} finally {
setLoading(false) // rulează mereu, cu sau fără eroare
}throw — cum arunci corect
throw new Error('User inexistent') // ✓ are stack trace
throw new Error('Request eșuat', { cause: originalError }) // ✓ păstrezi cauza
throw 'ceva' // ✗ fără stack, fără tipErori custom
Când codul care prinde trebuie să distingă tipurile de erori:
class HttpError extends Error {
constructor(status, message) {
super(message)
this.name = 'HttpError'
this.status = status
}
}
try {
await api('/users/5')
} catch (e) {
if (e instanceof HttpError && e.status === 404) return notFound()
throw e // ce nu știi trata, arunci mai departe
}Erori în cod async
async function load() {
try {
const res = await fetch('/api')
if (!res.ok) throw new HttpError(res.status, 'Request eșuat')
return await res.json()
} catch (e) {
console.error(e)
return null
}
}Un Promise respins și neprins = unhandledrejection. Detalii în Async.
Unde prinzi erorile — regula
- Prinde unde poți face ceva util: mesaj pentru user, retry, valoare de rezervă.
- Nu prinde „ca să nu crape” — o eroare înghițită ascunde bug-ul.
- Niciodată
catch {}gol. - În React / Next:
error.tsxe plasa de siguranță pentru ce scapă.
Pe scurt
- Eroare = obiect cu
name,message,stack; urcă până e prinsă. - Erori așteptate → valori returnate; neașteptate →
throw new Error(...). try/catch/finally; erori custom cuextends Error; nu înghiți erori.