Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

Asp.NET MVC’de Exception Filtresi

Her türlü masaüstü ya da web yazılımda olduğu gibi olası hata durumlarıyla karşılaşma payı mevcuttur.Bu durumlar server tabanlı, veritabanı bazlı ya da programatik mantık hataları olabilir.Kullanıcılar bu olası hata durumlarıyla karşı karşıya kaldığında elden pek bir şey gelmesi mümkün değildir.Bu durumda yapabileceğimiz en güzel şey, durumu olabildiğince kullanıcıya izah edebilmektir.Kimi programlama dilleri bu duruma mimarisinde çözüm sunarken, kimi programlama dillerinde manuel olarak programcı tarafından çözüm aranır.İşte Asp.NET MVC mimarisi böyle olası hata durumlarında kullanabilmemiz için Exception filtresini geliştirmiş ve biz kullanıcılarına sunmuştur.Bu filtre sayesinde kullanıcılarımıza, olası hata durumlarında hata sayfalarıyla açıklama yapabilir ve istediğimiz şekilde yönlendirme işlemini gerçekleştirebiliriz.

Öncelikle “Asp.NET MVC mimarisinde Exception filtresi hangi durumlarda devreye girer?” sorusunu yanıtlayalım.
-> MVC projemiz içinde bulunan herhangi bir Action metottan alınan istinai durum söz konusu olduğunda Exception filtresi devreye girmektedir.
Peki bu Exception diye nitelendirdiğimiz filtrenin kullandığı sınıfın adı nedir?” sorusuna gelirsek..
-> MVC mimarisiyle beraber gelen Exception filtresi varsayılan olarak HandleError sınıfını temsil etmektedir.Bu sınıf aynı zamanda bir Attribute sınıfıdır.Yani bir niteliktir.
Son olarak HandleError Attribute(Nitelik)’unun özellikleri nelerdir?
-> Çok kompleks bir yapısı yoktur.View ve Master olmak üzere iki tane özelliği mevcuttur.Herhangi bir istisnai durum söz konusu olduğu zaman bu özellikler sayesinde işlemlerimizi yapacağız.
View özelliği; Olası istisnai durum sonucu filtremiz devreye girerse eğer, hangi View ile çalışacağımızı belirtmek içindir.Varsayılan olarak “Error” değerine sahiptir.
Master özelliği; Olası istisnai durum sonucu filtremiz devreye girerse eğer, hangi Master ile çalışacağımızı belirtmek içindir.Varsayılan olarak “_Layout” değerine sahiptir.

Soru – Cevap yöntemiyle genel bilgilerimizi edindikten sonra filtremiz hakkında örneklendirme yapabiliriz.
Bir Asp.NET MVC projesi açalım ve “Home(Controller).cs” isimli Controller katmanımızda Controller sınıfımızı oluşturalım.

Öncelikle mimarimizde olası bir hata durumu yaratıp Exception filtremizi kullanmadan karşılaştığımız sonucu inceleyelim.

    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            throw new ExecutionEngineException();
            return View();
        }
    }

Yukarıdaki kod bloğunu incelerseniz eğer, “Home(Controller).cs” isimli Controller sınıfımız içinde varsayılan olarak gelen “Index” isimli Action metodumuzun içinde “throw” komutuyla “ExecutionEngineException” hatası fırlattırdım.Yani bu Action metod tetiklendiği zaman sayfamız hata verecektir.(Not 1: ExecutionEngineException hatasının ne olup olmadığı çok önemli değildir.Maksat bir hata alıp, alınan bu hata üzerinden yorumumuzu yapabilmektir.Not 2:throw komutu istisnai durumlar söz konusu olduğunda hata fırlatma komutudur.)

“Index” Action metodunun View katmanındaki görüntüsünüde oluşturduktan sonra projemizi derleyip çalıştıralım.
HataSayfasi

Yukarıdaki görüntüde gördüğünüz gibi hata mesajını almış bulunmaktayız.Evet bundan sonraki asıl işimiz alacağımız bu hata mesajını daha güzel ve kullanıcıya metinsel olarak ifade edebilen bir hale getirmektir.

Öncelikle kullanıcıya olası hatamızı daha güzel bir şekilde izah edebileceğimiz sayfamızı hazırlıyoruz.
View katmanındaki “Shared” isimli klasör altına “HataSayfasi.cshtml” isimli bir View oluşturup içini aşağıdaki gibi düzenliyorum.

<h2>Hata Sayfası</h2>
Beklenmedik bir hata oluşmuştur.Lütfen site yöneticisiyle irtibata geçiniz.

Bu işlemi gerçekleştirdikten sonra hangi Action metodumuzda istisnai durumlarda bu hata sayfasını kullanacaksak onu HandleError Attribute’u ile işaretliyoruz.Haliyle biz bu makalemizde Index Action metodunu işaretleyeceğiz.

    public class HomeController : Controller
    {
        [HandleError(View = "HataSayfasi")]
        public ActionResult Index()
        {
            throw new ExecutionEngineException();
            return View();
        }
    }

Yukarıdaki kod bloğunu incelerseniz eğer, “Index” isimli Action metodumuzu HandleError Attribute’uyla işaretlemiş bulunduk, lakin View özelliğine “HataSayfasi” değerini girdik.Bunun sebebi anlayacağınız üzere, varsayılan “Error” sayfasından ziyade bu sayfa üzerinde istisnai durum bilgisini versin diye istedik.

Artık son yapmamız gereken ayar ise, web.config dosyamızda hata sayfasını gösterme modunu açmamız gerekmektedir.Bu işlem için,

  <system.web>
    <customErrors mode="On"/>
  </system.web>

komutunu eklemeniz yeterlidir.

Artık projemizi derleyip çalıştırabiliriz.

HataSayfasi2

Gördüğünüz gibi istisnai durumda ayarladığımız sayfayla kullanıcıya durumu izah edebildik.Tabi siz asıl projelerinizde göze hitap eden tasarımlarınızla ve uygun üslubunuzla hatayı ifade etmeyi unutmayın. 🙂

Manuel oluşturduğumuz “HataSayfasi” isimli hata sayfamızda Exception nesnemizi kullanarak, terminolojikte olsa kullanıcıya daha detaylı bilgi arzedebiliriz.

Öncelikle Exception nesnemizin özelliklerini inceleyelim, ardından örnek bir kullanımını göreceğiz.

  • Message : İstisnai durum açıklamasını verir.
  • Source : Olası hatanın alındığı sınıf ya da nesne bilgilerini içerir.
  • TargetSite : İstisnai durumun verildiği metod hakkında bilgi verir.
  • StackTrace : Hataya neden olan çağrıları içeren stack(yığın) bilgisini içerir.
  • InnerException : Oluşan diğer iç hataları yakalamak amacıyla kullanılır.Eğer hiç bir iç hata oluşmazsa “null” değerini taşıyacaktır.

Örnek olarak aşağıdaki kodu inceleyelim,

<h2>Hata Sayfası</h2>
Hata Açıklaması<br />
@Model.Exception.Message
Hata İçerikleri<br />
@Model.Exception.StackTrace

Eğer projeyi derleyip çalıştırırsanız hayatla ilgili detaylı bilgileri ekrana sunmuş olacaksınız.

Son olarak,

    public class HomeController : Controller
    {
        [HandleError(ExceptionType = typeof(ExecutionEngineException), View = "HataSayfasi")]
        public ActionResult Index()
        {
            throw new ExecutionEngineException();
            return View();
        }
    }

yukarıdaki gibi Attribute’umuzu kullanırsak, “ExceptionType” özelliğine vermiş olduğumuz referans tipteki istisnai durumların yakalanmasını sağlamış oluruz.Farklı hata durumlarında filtremiz işleve girmeyecek ve kullanıcılarımız serverın o leziz hata sayfasıyla baş başa kalacaktır.

Exception filtresi sayesinde, olası hata durumları için manuel olarak Attribute yazma işleminden kurtuluyor ve esnek bir çalışma sergileyebiliyoruz.Hatasız projelere imza atmanız dileğiyle.. 🙂

İyi çalışmalar..

Bunlar da hoşunuza gidebilir...

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir