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
- Hata fırlatırken mesaj net olsun — "x failed" değil, "user 42 not found"
- Sadece bilinçli yakala —
try/catchher yerde değil, hatanın kontrol edilebileceği yerde olsun - Yutma — hatayı sessizce kaybetme, en kötü ihtimalle log'a yaz
- Boundary koy — async işin başında ve sonunda. Ortada her şey doğru kabul edilebilir.