JavaScript: Başlangıçtan İleri Seviyeye
Bölüm 20 / 312 dk okuma

Hata Yönetimi

try/catch/finally, Error sınıfları, custom errorlar ve global hata yakalama.

try / catch / finally

try {
  riskliIs();
} catch (err) {
  console.error(err);
} finally {
  temizle(); // hata olsa da olmasa da çalışır
}

finally, kaynakları kapatmak için çok kullanışlıdır (dosya, bağlantı, loading state).

Error fırlatma

throw new Error("Bir şey ters gitti");
throw new TypeError("Bekliyordum number");
throw new RangeError("0-100 arası bir değer ver");

throw ifadesi her şeyi atabilir ama her zaman bir Error sınıfı kullan. Stack trace ve instanceof kontrolleri için.

Error objesinin alanları

try {
  throw new Error("merhaba");
} catch (err) {
  err.message   // "merhaba"
  err.name      // "Error"
  err.stack     // çağrı yığını
  err.cause     // (opsiyonel) sebep error
}

cause ile chained errorlar

try {
  await getUser();
} catch (originalErr) {
  throw new Error("Kullanıcı yüklenemedi", { cause: originalErr });
}

Custom Error sınıfı

class HttpError extends Error {
  constructor(status, message) {
    super(message);
    this.name = "HttpError";
    this.status = status;
  }
}
 
try {
  throw new HttpError(404, "Bulunamadı");
} catch (err) {
  if (err instanceof HttpError && err.status === 404) {
    redirect("/404");
  } else {
    throw err; // bilmediğini tekrar fırlat
  }
}

Async hata yakalama

async function fn() {
  try {
    const data = await api();
    return data;
  } catch (err) {
    log(err);
    throw err; // ya işle ya da yukarı bırak
  }
}

Sadece işleyebileceğin hatayı yakala. Yoksa olduğu gibi yukarı bırak — "swallow" etme.

Promise zincirinde

fetch(url)
  .then((r) => r.json())
  .then((d) => kullan(d))
  .catch((err) => log(err));   // tüm zincirin hatası

Her then'in kendi catch'i değil, zincirin sonunda tek catch.

Global yakalama

Tarayıcı

window.addEventListener("error", (e) => {
  log("Senkron hata:", e.error);
});
 
window.addEventListener("unhandledrejection", (e) => {
  log("Yakalanmamış promise:", e.reason);
});

Node.js

process.on("uncaughtException", (err) => { ... });
process.on("unhandledRejection", (reason) => { ... });

Bunlar son savunma hattı. Production'da log'a yaz, monitoring servisine gönder, ama uygulamayı yine de kontrollü kapat.

Pratik kurallar

  1. Hata fırlatırken mesaj net olsun — "x failed" değil, "user 42 not found"
  2. Sadece bilinçli yakalatry/catch her yerde değil, hatanın kontrol edilebileceği yerde olsun
  3. Yutma — hatayı sessizce kaybetme, en kötü ihtimalle log'a yaz
  4. Boundary koy — async işin başında ve sonunda. Ortada her şey doğru kabul edilebilir.

Bu bölümü bitirdin mi?

İlerlemen tarayıcıda saklanır, eğitim listesinde görünür.

Paylaş