Kural
Hataları catch bloklarında yönetin.
Boş catch blokları hataları sessizce yutar
ve hata ayıklamayı zorlaştırır.
Desteklenen diller: Java, C, C++, PHP, JavaScript,
TypeScript, Go, PythonGiriş
Boş catch blokları, prodüksiyon kodundaki en tehlikeli antipaterns'lerden biridir. İstisnalar yakalandığı halde yönetilmediğinde, hata hiç iz bırakmadan ortadan kaybolur. Uygulama; bozuk durumlar, geçersiz veriler veya durdurulması gereken başarısız işlemlerle çalışmaya devam eder. Kullanıcılar özelliklerin çalışmadığı ancak hiçbir hata mesajı almadıkları sessiz hatalarla karşılaşır. Operasyon ekiplerinin hata ayıklayabileceği hiçbir log bulunmaz. Bir şeylerin yanlış gittiğine dair tek işaret, saatler veya günler sonra zincirleme hatalar sistemi kullanılamaz hale getirdiğinde ortaya çıkar.
Neden önemli?
Hata ayıklama ve olay müdahalesi: Boş catch blokları hata loglarını ortadan kaldırır. Mühendislerin yığın izi (stack trace), hata mesajı veya hatanın ne zaman ve nerede gerçekleştiğine dair hiçbir göstergesi olmaz, bu da sorunları yeniden üretmeyi neredeyse imkansız hale getirir.
Sessiz veri bozulması: Veritabanı işlemlerinde veya API çağrılarında boş catch blokları içinde hatalar meydana geldiğinde, uygulama sanki başarılı olmuş gibi devam eder. Kayıtlar kısmen güncellenir, işlemler yarım kalır ve veri bozulması fark edildiğinde denetim izi (audit trail) çoktan kaybolmuştur.
Güvenlik açıkları: Boş catch blokları, kimlik doğrulama hataları veya yetkilendirme kontrolleri gibi güvenlik açıklarını maskeler. Güvenlik açısından kritik bir yolda istisnayı tetikleyen bir saldırgan, hata sessizce yutulursa korumaları tamamen atlayabilir.
Zincirleme hatalar: Hatalar yutulduğunda, uygulama geçersiz bir durumda çalışmaya devam eder. Başarısız olan işlemin sonucuna bağlı olan sonraki işlemler de başarısız olur ve mühendisleri gerçek kök nedenden uzaklaştıran bir hata zinciri yaratır.
Kod örnekleri
❌ Kural dışı:
async function updateUserProfile(userId, profileData) {
try {
await db.users.update(userId, profileData);
await cache.invalidate(`user:${userId}`);
await searchIndex.update(userId, profileData);
} catch (error) {
// TODO: handle error
}
return { success: true };
}Neden yanlış: Herhangi bir işlem başarısız olursa, hata sessizce yoksayılır ve fonksiyon başarılı sonucu döndürür. Veritabanı güncellenebilir ancak önbellek geçersiz kılma (cache invalidation) başarısız olabilir ve eski veriler kalabilir. Veya arama dizini güncellemesi başarısız olur, bu da kullanıcının aranamaz hale gelmesine yol açar ancak sorunu gösterecek hiçbir log veya uyarı üretilmez.
✅ Kurallara uygun:
async function updateUserProfile(userId, profileData) {
try {
await db.users.update(userId, profileData);
await cache.invalidate(`user:${userId}`);
await searchIndex.update(userId, profileData);
return { success: true };
} catch (error) {
logger.error('Failed to update user profile', {
userId,
error: error.message,
stack: error.stack
});
throw new ProfileUpdateError(
'Unable to update profile',
{ cause: error }
);
}
}
Neden önemli: Her hata bağlamıyla birlikte loglanır ve hata ayıklama bilgisi sağlar. Hata, çağrı yapan üst koda (caller) iletilerek uygun düzeyde doğru hata yönetimi sağlanır. İzleme sistemleri bu hatalar konusunda uyarı verebilir ve uygulama geçersiz durumla devam etmek yerine hızlıca hata verip durur (fail fast).
Sonuç
Boş catch blokları prodüksiyon kodunda asla kabul edilemez. Yakalanan her istisnanın en azından loglanması gerekir ve birçoğunun üst katmanlara iletilmesi veya belirli kurtarma eylemlerini tetiklemesi şarttır. Bir hatayı gerçekten yoksaymanız gerekiyorsa, bunun iş açısından gerekçesini açıklayan bir yorum satırıyla belgelendirin. Varsayılan yaklaşım her zaman hataları sessizce göz ardı etmek değil, açıkça yönetmek olmalıdır.

