Kural
İşleme hataları işleyin catch bloklarında
Boş catch blokları sessizce hataları hataları,
hata hata ayıklamayı zorlaştırır.
Desteklenen diller: Java, C, C++, PHP, JavaScript,
TypeScript, Go, PythonGiriş
Boş yakalama blokları, üretim kodundaki en tehlikeli anti-örneklerden biridir. İstisnalar yakalandığında ancak işlenmediğinde, hata iz bırakmadan ortadan kaybolur. Uygulama, yürütmeyi durdurması gereken bozuk durum, geçersiz veriler veya başarısız işlemlerle çalışmaya devam eder. Kullanıcılar, özelliklerin çalışmadığı ancak herhangi bir hata mesajı almadıkları sessiz arızalarla karşılaşır. Operasyon ekipleri, hata ayıklama için kullanabilecekleri herhangi bir günlüğe sahip değildir. Bir sorunun varlığını gösteren tek işaret, saatler veya günler sonra, zincirleme arızaların sistemi kullanılamaz hale getirmesiyle ortaya çıkar.
Neden önemli?
Hata ayıklama ve olay müdahalesi: Boş catch blokları hata günlüklerini ortadan kaldırır. Mühendisler, hata yığını izi, hata mesajı ya da arızanın ne zaman ve nerede meydana geldiğine dair herhangi bir ipucuna sahip olmadıkları için sorunları yeniden canlandırmak neredeyse imkânsız hale gelir.
Sessiz veri bozulması: Veritabanı işlemleri veya API çağrıları boş catch blokları içinde başarısız olduğunda, uygulama bunlar başarılı olmuş gibi devam eder. Kayıtlar kısmen güncellenir, işlemler tamamlanmaz ve bozulma fark edildiğinde denetim izi kaybolmuş olur.
Güvenlik açıkları: Boş catch blokları, kimlik doğrulama hataları veya yetkilendirme kontrolleri gibi güvenlik hatalarını gizler. Güvenlik açısından kritik bir yolda bir istisna tetikleyen bir saldırgan, hata sessizce yutulursa koruma önlemlerini tamamen atlatabilir.
Zincirleme hatalar: Hatalar gizlendiğinde, uygulama geçersiz bir durumda çalışmaya devam eder. Hatalı işlemin sonucuna bağlı olan sonraki işlemler de başarısız olur ve mühendisleri asıl kök nedenin izinden saptıran bir hata zinciri oluşur.
Kod örnekleri
❌ Uygun değil:
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 göz ardı edilir ve işlev başarılı olarak geri döner. Veritabanı güncellenmiş olabilir, ancak önbelleğin geçersiz kılınması başarısız olabilir ve bu da güncel olmayan verilerin kalmasına neden olabilir. Ya da arama dizini güncellemesi başarısız olur ve kullanıcı aranamaz hale gelir; ancak sorunu gösteren herhangi bir günlük kaydı veya uyarı bulunmaz.
✅ Uygunluk:
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 }
);
}
}
Bunun önemi: Her hata, bağlam bilgileriyle birlikte günlüğe kaydedilerek hata ayıklama bilgileri sağlanır. Hata, çağrıyı yapan birime iletilir ve böylece uygun düzeyde doğru bir hata işleme süreci sağlanır. İzleme sistemleri bu hatalar hakkında uyarı verebilir ve uygulama, geçersiz bir durumda devam etmek yerine hızlı bir şekilde sonlandırılır.
Sonuç
Üretim kodunda boş istisna yakalama blokları asla kabul edilemez. Yakalanan her istisna en azından günlüğe kaydedilmelidir; çoğunun ise çağıranlara iletilmesi veya belirli kurtarma işlemlerini tetiklemesi gerekir. Bir hatayı gerçekten görmezden gelmeniz gerekiyorsa, bunun iş açısından gerekçesini açıklayan bir yorumla nedenini belgelendirin. Varsayılan yaklaşım her zaman hataları açıkça ele almak olmalı, sessizce göz ardı etmek değil.

