C# exception yapısı, exception fırlatmak ve throw ile throw ex farkı
 
Bu yazıda, iç içe metodlarda exception yönetimi ve throw kullanımına değineceğim.

Bir metodumuz olsun try ve catch bloğu olsun ve bu metod içerisinde bir başka metod da çağırılsın.

Çağırılan metodda da try catch olsun. Çağrılan method ve ana metod da ikisinde de çalışma anında ortaya çıkacak bir hata olsun. Bu durumda ben içerdeki metodun hatasını görmek istersem ne yapmam gerekir?

Normal yapıda: Aşağıdaki örnek üzerinden gidelim Index ana method olsun ve içerisinde GetName çağrılan metod olsun.
 
        public ActionResult Index()
        {
            try
            {
                GetName();
                Dictionary dList = new Dictionary();
                dList.Add(1, 3);
                dList.Add(1, 4);
            }
            catch (Exception ex)
            {
                TempData["Result"] = ex.Message;
            }
            return View();
        }


        public int GetName()
        {
            string message = string.Empty;
            int id =0;
            try
            {
                id = Convert.ToInt32("Numara");
            }
            catch (Exception ex)
            {
                message = ex.Message;
            }
            return id;
        }

Index metodunu işletiyoruz ilk olarak GetName() metoduna giriyor ve burada "Numara" kelimesi int tipine çevrilmek isteniyor çevrilemedğinden hata veriyor ve catch bloğuna düşüyor.

GetName() metodunun catch bloğunda ise hata message adlı bir değişkene yazılıyor. Herhangi bir hata fırlatma yok henüz ve try catch ile de kontrol alındığından metod işletime devam ediliyor. Daha sonra Index metodu devam ediliyor ve dList dictionary'sine aynı keyden ikinci kayıt eklenmek istediğinde hata fırlatıyor yine catch bloğuna düşüyor.

Index metodunun catch bloğanda ex.Message bize dictionary hatasını gösterir. Fakat biz ilk hata olan GetName() metodunun hatasını görmek istiyorsak bu noktada exception fırlatmalıyız.

"throw" kelimesi türkçe olarak "fırlatmak, atmak" anlamına gelmektedir. Bu kelime ile exception fırlatılır.
Şimdi metodu biraz düzenleyelim. GetName() metodunun catch bloğuna throw ex ekleyelim. Aşağıdaki gibi,
 

        public ActionResult Index()
        {
            try
            {
                GetName();
                Dictionary dList = new Dictionary();
                dList.Add(1, 3);
                dList.Add(1, 4);
            }
            catch (Exception ex)
            {
                TempData["Result"] = ex.Message;
            }
            return View();
        }


        public int GetName()
        {
            string message = string.Empty;
            int id =0;
            try
            {
                id = Convert.ToInt32("Numara");
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return id;
        }
Bu şekilde çalıştırıldığında Index metodundaki TempData["Result"]’a dictionary hatası değilde Convert.ToInt32 deki hata yazılır.
Çünkü içteki metod throw ex; ile exception fırlatıyor. throw ex geldiği ana GetName() metodunda çıkıyor bir üsttetki metodun yani Index metodunun catch bloğuna geliyor. Ve ilgili hata oraya taşınmış olunuyor.

Dikkat ettiysek hata aldığı an üstteki metodun catch bloğuna girer üstteki bloğun devamındaki kodlar işletilmez. Burada önemli bir konu vardır.
throw ex; yerine throw; da kullanabilirdik.

throw ile throw ex farkı 

Burada throw ex; ile throw; arasındaki hata taşıma farkı ise ex.Message yani mesaj yazısı değişmiyor aynı hata yazısıdır. Ama ex.StackTrace adlı özelliği farklı oluyor.

throw ex :
Bir üstteki metodun exception'una girdiğinde yeniden exception oluşturur. Exception mesajı bir öncekinin aynısı kalır ama StackTrace değişir. StackTrace şöle değişir detayı azaltılır. Yalnızca hata alınan metod ve bir önceki hatanın geldiği metod gösterilir. Daha öncesi ve detayını göstermez.

throw:
Hatayı genişleterek taşır. İlk StackTrace tam kalacak şekilde bir üsttekinin catch bloğunda kendi StackTrace'i + şu anki metodun yerini gösteren StackTrace ekleyerek yukarı taşır. Böylece hata yeri detaylıca en sondaki catch bloğuna doğru taşınır. Yani throw kullanmak daha avantajlıdır. Throw ex; her fırlattığı catch de yeniden oluşturuluyor. Throw ise var olan taşınıyor.

C# .net exception yapısı bu şekildedir. Metodlar ile alıştırma yaparak konuyu daha iyi irdeleyebilirsiniz. 
 

Author: Engin ATALAY
Date: 01.09.2016 18:48:12
View Count: 1582
 
 

COMMENTS
 
No comments yet. Be the first to comment who you are.
 
 
 
 
 
 
 
WRITE COMMENT
 
 
Your Name :
 
 
 
E-mail :
 
 
 
Your Message :
 
 
 
 
 
 
 
This project : ASP.NET MVC , RAZOR, Entity Framework , CSS , HTML , JQUERY(2.0.2) , AJAX the C# side-tier architecture was developed with logic.
 
Yukarı Çık