Asp.Net Core MVC Uygulamalarında Exception Handle İşlemi

Hüseyin Şimşek
4 min readJun 10, 2021

I never lose. I either win or learn.

Photo by Ashim D’Silva on Unsplash

Visual Studio üzerinde MVC pattern seçilerek bir proje oluşturduğumuzda default ExceptionHandler middleware eklenmektedir. Yine envirenment a göre exceptionhandle edilir. Örneğin development ortamında developer friendly olarak expection detayı gösterilirken, production ortamında ise yakalanmamış bir hata meydana geldiğinde default Home/Error sayfasına yönlendirme işlemi yapılmaktadır. Bununla birlikte bir id parametresi alan bir action’ımız olsun ve action db den id ile veriyi çeksin. Id değeri ile sorgu sonucu db den bir değer gelmezse NotFound başarılı olmayan bir statuscode döndüğümüzü düşünelim. Yine mevcut olmayan bir sayfaya istek gönderilmeye çalışıldığını düşünelim(NotFound). Bu durumda bir exception fırlatılmadığı için middleware bunu yakalamayacaktır. Bu gibi başarılı olmayan durum kodlarını handle edebilmemiz için StatusCodePage middleware’ini kullanabiliriz. Bu iki durumu örnek kodları üzerinden (anladığım kadarı ile) anlatmaya çalışacağım.

Exception Fırlatıldığı Durumunda ExceptionHandler Kullanımı

Default Middleware

Default olarak projeyi oluşturduğumuzda yukarıdaki gibi development ortamı haricinde Home/Error sayfasına yönlendirecek şekilde middleware ayarlanmıştır. Yine ilgili ekranda test etmek için launchSettings.json dosyasından ASPNETCORE_ENVIRONMENT değerini “Production” olarak değiştirip test edebiliriz. Burada test ettiğimizde ise hatanın detayı hakkında da ekrana bilgiler göstermektedir. Bu durumu kullanıcılarımıza göstermek istemeyiz. Bunun için ya ilgili view’de düzenleme yapabiliriz ya da farklı bir view tasarlayıp o action’a yönlendirebiliriz.

Ben örnek için ErrorController ekledim. Index methodu üzerinden bir exception yakalandığında bu sayfaya yönlenecektir. Kullancıya sadece bir hatayla karşılaştığı gibi bir bilgi göstersek de biz uygulamanın karşılaştığı hatalar hakkında bilgi edinebilmemiz için hataları bir şekilde loglamamız, bir notification almamız gerekmektedir. İşte bu iki durumuda karşılayacak action’ınımızı tanımlayabiliriz:

ExceptionHandler middleware çalıştığında IExceptionHandlerFeature veya IExceptionHandlerPathFeature olarak iki ayrı feautre verir. Bu iki feature’da error hakkında bilgi verir. Fark olarak IExceptionHandlerPathFeature hangi path’den exception geldiği bilgisinide verir.

Ben örnekte viewbag ile bir default mesaj gönderiyorum. Ayrıca log’a exception url ve exception message’ını yazdırıyorum. Böylece hem uygulama hataları hakkında bilgi edinmek için log kayıt ediyoruz hem de kullanıcıya uygun bir mesaj gösteriyoruz.

Exception Ekranı

Non-Success Durumlarda StatusCodePage Middlewarelerinin Kullanımı

StatusCodePage middlewareleri 400–599 arasındaki durum kodlarını işlememiz için kullanabileceğimiz middlewarelerdir. Herhangi bir body değeri dönmez.Bu middleware’leri ExceptionHandler middleware’inden sonraki satırda register edebiliriz. Bu durumlarla karşılaştığımızda yönetebilmek için üç tane middleware bulunmaktadır:
UseStatusCodePages : Bu middleware eklendiğinde karşılaşılan durum kodu hakkında basit bir text bilgi verir.

app.UseStatusCodePages()

UseStatusCodePagesWithRedirects : Bu middleware kullanıldığında sadece bir durum text i göstermek yerine user friendly bir error page gösterebiliriz.(ben örnekte aynı Error/Index sayfasına yönlendirmeyi denedim. Burada kod içerisinde exception kontrolüne göre düzenleme yaptığım için non-status code’lar için exception değeri null gelecektir. Index methodundaki exception null kontrolünü o yüzden ekledim.) Bu durumda ise sadece yönlendirme yapıldığı için aslında error page sayfası 200 success kodu vereceği için mevcut error hakındaki bilgiyi kaybedeceğiz.

app.UseStatusCodePagesWithRedirects(“/Error”);

UseStatusCodePagesWithReExecute: Bu middleware ise status code değeri döndükten sonra pipeline tekrar çalıştırılır(re-execute). Böylece hem status code değerini alabiliriz hem de kullancıya uygun bir sayfa dönebiliriz. Aşağıdaki satır gibi middleware’i register edebiliriz. Parametreye statuscode değeri gönderilecektir.

app.UseStatusCodePagesWithReExecute(“/Error/{0}”);

ErrorController tarafında karşılacak action’ımızda bu şekildedir. Burada Http verb’lerini kullanmıyoruz. Bunun yerine Route attribute’unu kullanarak handle ediyoruz. Burada da yine nereden bu değerin geldiğini ve hangi durum kodu alındığını kısaca bu şekilde gösterebiliriz. Daha detaylı loglama ve kullanıcıya daha detaylı değer göstermek için de gerekli düzenlemeleri yapabiliriz.

Non Status Code Ekranı

Örnek Kod Linki:

Kaynak:

--

--

Hüseyin Şimşek

I’m Huseyin, a software developer from Turkiye. I have been working in IT industry since 2018. I’m interested in Dotnet and Web Development