JavaScript’te Error Cause ve Hata Zinciri: Kök Nedeni Kaybetmeden Hata Yönetimi
Error cause ile hataları sarın, zincirleyin ve kök nedeni loglarda kaybetmeden daha okunur hata yönetimi kurun.
Modern JavaScript’te hataları sadece yakalayıp console.error yapmak, özellikle katmanlı mimarilerde (API → servis → UI) kök nedeni görünmez kılar. ES2022 ile gelen Error cause alanı, hataları “sarmalayarak” (wrap) asıl hatayı korumanıza izin verir.
Problem: Katmanlı hatalarda bağlam kaybı
Bir ağ isteği başarısız olduğunda UI katmanında şu tarz bir hata görmek yaygındır:
throw new Error("Sipariş yüklenemedi");
Bu mesaj kullanıcıya anlamlı olabilir; ama geliştirici için asıl kritik bilgi (HTTP status, timeout, parse hatası vb.) kaybolur.
Çözüm: new Error(message, { cause })
cause ile yeni bir hata üretirken önceki hatayı ekleriz:
try {
await fetch("/api/orders");
} catch (err) {
throw new Error("Sipariş servisine erişilemedi", { cause: err });
}
Böylece üst katman hem kendi bağlamını ekler, hem de alttaki hatayı taşır.
Pratik örnek: Fetch → parse → domain
Aşağıdaki örnekte üç katmanda hata sarıyoruz:
async function getJSON(url) {
const res = await fetch(url);
if (!res.ok) {
throw new Error(`HTTP ${res.status} (${res.statusText})`);
}
try {
return await res.json();
} catch (err) {
throw new Error("JSON parse edilemedi", { cause: err });
}
}
async function getOrders() {
try {
return await getJSON("/api/orders");
} catch (err) {
throw new Error("Siparişler alınamadı", { cause: err });
}
}
(async () => {
try {
await getOrders();
} catch (err) {
// Uygulama genel hata yakalayıcı
console.error("Hata:", err.message);
console.error("Kök neden:", err.cause);
}
})();
Bu yaklaşım, loglarda “Siparişler alınamadı” bağlamını korurken altta HTTP hatası mı, parse hatası mı olduğunu hızlıca görmenizi sağlar.
Hata zincirini okunur loglamak
console.error(err) bazı ortamlarda cause’u otomatik gösterir, bazı ortamlarda göstermez. Küçük bir yardımcı fonksiyon işinizi kolaylaştırır:
function logErrorChain(err) {
let i = 0;
while (err) {
console.error(`[${i}] ${err.name}: ${err.message}`);
err = err.cause;
i++;
}
}
Kullanım:
try {
await getOrders();
} catch (err) {
logErrorChain(err);
}
Ne zaman kullanmalı?
- Katmanlı sistemlerde: API client, servis, domain, UI katmanları
- Kütüphane yazarken: Tüketiciye anlamlı üst seviye mesaj verip kök hatayı saklamamak
- Gözlemlenebilirlikte: Sentry/Datadog gibi araçlara hem bağlam hem kök neden göndermek
Dikkat edilmesi gerekenler
cause’a her şeyi koymayın: Büyük nesneleri ya da hassas verileri (token, kişisel veri) hata zincirine eklemek log sızıntısına yol açabilir.- Kullanıcıya gösterilecek mesaj ile log mesajını ayırın: UI’da kısa/yerelleştirilmiş mesaj, logda teknik detay.
Sonuç
Error cause, JavaScript’te hata yönetimini “mesaj üretmekten” çıkarıp izlenebilir bir hata hikayesi haline getirir. Bir sonraki üretim hatasında “nerede patladı?” yerine “neden patladı?” sorusuna daha hızlı ulaşırsınız.