webroad.online
  1. 1Web
  2. 2HTML
  3. 3CSS
  4. 4JavaScript
  5. 5TypeScript
  6. 6Git
  7. 7Unelte
  8. 8React
  9. 9State management
  10. 10Next.js
  11. 11Formulare
  12. 12Date și backend
  13. 13SEO
  14. 14Tailwind CSS
  15. 15Animații
  16. 16Testare
  17. 17Arhitectură
JavaScript · Lecția 13 din 17

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ă tip

Erori 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

  1. Prinde unde poți face ceva util: mesaj pentru user, retry, valoare de rezervă.
  2. Nu prinde „ca să nu crape” — o eroare înghițită ascunde bug-ul.
  3. Niciodată catch {} gol.
  4. În React / Next: error.tsx e 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 cu extends Error; nu înghiți erori.

Surse oficiale

Exerciții

Ți-a fost utilă pagina?

Un click — fără cont.