Error Handling¶
Hata yönetimi (error handling), yazılımın güvenilirliğini ve kararlılığını artıran önemli bir unsurdur. Ancak, hataların doğru yönetilmemesi, hata ayıklamayı zorlaştırabilir ve uygulama performansını olumsuz etkileyebilir.
1. Hataların Genel Olarak Yakalanması¶
❌ Yanlış Kullanım: Tüm hataları Exception
sınıfıyla yakalamak.
try
{
// İşlem
}
catch (Exception ex)
{
Console.WriteLine($"Hata: {ex.Message}");
}
✅ İdeal Kullanım: Spesifik hata türlerini yakalayarak daha detaylı hata yönetimi gerçekleştirin.
try
{
// İşlem
}
catch (NullReferenceException ex)
{
Console.WriteLine($"Null reference hatası: {ex.Message}");
}
catch (FileNotFoundException ex)
{
Console.WriteLine($"Dosya bulunamadı: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"Beklenmeyen bir hata: {ex.Message}");
}
2. Finally Bloğunun Yanlış Kullanımı¶
❌ Yanlış Kullanım: finally
bloğu içinde kodun kontrol dışı bırakılması.
try
{
// İşlem
}
finally
{
throw new InvalidOperationException("Hatalı işlem");
}
✅ İdeal Kullanım: Kaynakların doğru şekilde serbest bırakılmasını sağlayın.
FileStream? file = null;
try
{
file = new FileStream("data.txt", FileMode.Open);
// İşlem
}
finally
{
file?.Dispose();
}
3. Asenkron Hata Yönetimi¶
❌ Yanlış Kullanım: Asenkron hataları await
etmeden yakalamaya çalışmak.
try
{
DoAsync(); // await eksik
}
catch (Exception ex)
{
Console.WriteLine($"Hata: {ex.Message}");
}
✅ İdeal Kullanım: Asenkron işlemleri await
ile yakalayarak doğru hata yönetimi sağlayın.
try
{
await DoAsync();
}
catch (Exception ex)
{
Console.WriteLine($"Asenkron hata: {ex.Message}");
}
4. Hataların Günlüğe Kaydedilmemesi¶
❌ Yanlış Kullanım: Hataları yalnızca konsola yazdırmak.
catch (Exception ex)
{
Console.WriteLine($"Hata: {ex.Message}");
}
✅ İdeal Kullanım: Günlükleme (logging) framework’leri ile hataları kaydedin.
var logger = LoggerFactory.Create(builder => builder.AddConsole()).CreateLogger("ErrorLogger");
try
{
// İşlem
}
catch (Exception ex)
{
logger.LogError(ex, "Bir hata oluştu.");
}
5. Global Exception Handler¶
❌ Yanlış Kullanım: Tüm hataları global olarak yönetmemek.
app.MapGet("/", () => throw new Exception("Bir hata oluştu!"));
✅ İdeal Kullanım: Tüm uygulama genelinde hataları ele almak için bir middleware kullanın.
app.UseExceptionHandler("/error");
app.Map("/error", (HttpContext context) =>
{
var exception = context.Features.Get<IExceptionHandlerFeature>()?.Error;
return Results.Problem(detail: exception?.Message, statusCode: 500);
});
6. Hata Yönetiminde Özel Sınıflar Kullanımı¶
❌ Yanlış Kullanım: Hata yönetimi için standart Exception
sınıfını doğrudan kullanmak.
throw new Exception("Hatalı işlem");
✅ İdeal Kullanım: Özel hata sınıfları oluşturarak daha anlamlı hata mesajları sağlayın.
public class CustomException : Exception
{
public CustomException(string message) : base(message) { }
}
throw new CustomException("Bu özel bir hatadır.");
7. Hataların Sessizce Yutulması¶
❌ Yanlış Kullanım: Hataları yakalayıp hiçbir işlem yapmamak.
try
{
// İşlem
}
catch
{
// Sessizce yutulan hata
}
✅ İdeal Kullanım: Hataları doğru bir şekilde işleyin veya kaydedin.
try
{
// İşlem
}
catch (Exception ex)
{
Console.WriteLine($"Hata: {ex.Message}");
}