ASP.NET CORE'da Global Exception Handling
Merhaba;
Bu yazımda, kendi projelerimde de sık sık kullandığım, Global exception handler(Global hata yakalama) middleware'ından kısaca bahsedeceğim.
Global Exception Handling Nedir?
Global exception handling, uygulamamız içerisinde hata alınan herhangi bir yerde, bu hatayı yakalayarak bize bildiren yapıdır. Bu yapı ASP.NET CORE'da UseExceptionHandler
adında bi middleware aracılığıyla bize bildirilir.
Lafı fazla uzatmadan hemen kodlamaya başlayalım. Global Exception Handling için ilk olarak middleware'ımızı oluşturacağız. Yeni bir ASP.NET CORE projesi oluşturarak UseCustomExceptionHandler adında bir sınıf ekleyelim.
public static class UseCustomExceptionHandler
{
public static void UseCustomException(this IApplicationBuilder app)
{
app.UseExceptionHandler(cfg =>
{
cfg.Run(async context =>
{
context.Response.ContentType = "application/json";
var exceptionFeature = context.Features.Get();
var statusCode = 500;
context.Response.StatusCode = statusCode;
var response = new { StatusCode = statusCode, Message = exceptionFeature.Error.Message };
await context.Response.WriteAsync(JsonSerializer.Serialize(response));
});
});
}
}
Burada UseExceptionHandler
middleware'ını kendimize göre düzenliyoruz.
Şimdi bu middleware'ımızı Program.cs
içerisine ekleyelim.
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseCustomException();
app.UseAuthorization();
app.MapControllers();
app.Run();
app.UseCustomException();
bloğunu eklediğimiz yer önemlidir. Uygulamamız middleware'ları buradaki sıraya göre işler. Hata alınabilecek önemli noktalardan daha önde olması(Örneğin Authentication, Authorization vs.) gerekmektedir.
Test için kullanacağımız Action içerisine herhangi bir hata ekleyelim;
[HttpGet]
public IActionResult Get()
{
throw new Exception("Bir Hata Oluştu");
return null;
}
Testimizi gerçekleştirelim ve sonuca bakalım 👇
Görüldüğü gibi, istediğimiz tipte bir geri dönüş aldık.
Tabi ki uygulamamızda her zaman 500 dönmeyeceğiz, hatalarımızı ayıklamamız da gerekmekte. Onun için ClientException
adında yeni bir sınıf ekliyoruz.
public class ClientException:Exception
{
public ClientException(string message) : base(message)
{
}
}
Bu şekilde bırakmamız yeterli olacaktır. Middleware'ımızda da bir güncelleme yapmamız ve hatanın tipini algılayıp ona göre bir response hazırlamamız gerekiyor.
public static class UseCustomExceptionHandler
{
public static void UseCustomException(this IApplicationBuilder app)
{
app.UseExceptionHandler(cfg =>
{
cfg.Run(async context =>
{
context.Response.ContentType = "application/json";
var exceptionFeature = context.Features.Get();
var statusCode = exceptionFeature.Error switch
{
ClientException => 400,
_ => 500
};
context.Response.StatusCode = statusCode;
var response = new { StatusCode = statusCode, Message = exceptionFeature.Error.Message };
await context.Response.WriteAsync(JsonSerializer.Serialize(response));
});
});
}
}
Burada kendime göre bir düzenlemeyle, artık StatusCode hatanın tipine göre dolduruluyor.
Test için Action üzerindeki kodumu throw new ClientException("Bir Hata Oluştu")
şeklinde güncelliyorum.
[HttpGet]
public IActionResult Get()
{
throw new ClientException("Bir Hata Oluştu");
return null;
}
Tekrar bir test yapalım ve sonuca bakalım 👇
Görüldüğü gibi ClientException
olarak gönderdiğimiz hata, StatusCode 400 olarak geldi. Bu şekilde hatalarınızı özelliştirebilirsiniz.
Bugün ASP.NET CORE'da Global Exception Handling konusunu ele aldık ve bir test gerçekleştirdik.
Projenin github reposuna buradan ulaşabilirsiniz.
Sabırla okuduğunuz için teşekkür eder, bol kodlu günler dilerim 🤩