1 Aralık 2011 Perşembe

C# Try, Catch, Finally Blokları

Projelerimizde başımızı en çok ağrıtan etmenlerden birisi çalışma zamanı hatalarıdır(exception). Çok basit anlamda hata yönetimine bir giriş yapıyor olacağız. Amacımız try, catch ve finally bloklarının çalışma mantığını anlamak.

Bir örnek ile başlayalım. object tipinden bir değişken tanımlayalım ve null değer atayalım. Yani heap’de herhangi bir nesneyi işaret etmesin. Daha sonra da bu değişken üzerinden ToString() metodunu çağıralım.

class Program

    {

        static void Main(string[] args)

        {

            object o = null;

            Console.WriteLine(o.ToString());

        }

    }

Derleme zamanında her hangi bir hata ile karşılaşmayacağız, ancak kodu çalıştırdığımızda exception alacağız.

image

Aldığımız hata son derece normaldir, herhangi bir nesneyi işaret etmeyen bir değişken üzerinden metot çağrısı yaptığımızdan ötürü böyle bir hata aldık. Bu durum da programımızın akışını durdurdu ve istemediğimiz bir sonuç doğurdu.

İşte bu noktada try catch bloklarını kullanabiliriz. try bloğu içerisinde yazdığımız kodlarda her hangi bir hata meydana gelirse program o satırı atlayarak catch bloğundan çalışmaya devam eder. catch bloğu içerisinde de log tutma, mail gönderme vb işleri ele alabilmemiz mümkündür.

class Program

    {

        static void Main(string[] args)

        {

            try

            {

                object o = null;

                Console.WriteLine(o.ToString());

                int a = 5, b = 10;

                Console.WriteLine(a + b);

            }

            catch

            {

                Console.WriteLine("Hata alındı ancak program çalışmaya devam edecek.");

            }

 

            Console.WriteLine("Program çalışmaya devam ediyor.");

        }

    }

“o” değişkeni üzerinden ToString metodunu çağırdığımız yerde exception alacağız. Program hata aldıktan sonra catch bloğuna geçiş yapar. Dolayısı ile try bloğu içerisinde, hata alınan satırın altında kalan kodlar çalışmaz. catch bloğundan çıktıktan sonra da program çalışmaya devam eder.

image

Alınan exception detaylarını catch bloğu içerisinde elde edebiliriz. try içerisinde hata meydana geldiğinde, hataya ilişkin detaylar Exception tipi içerisinde tutulur. catch bloğunda da parametre olarak bu tipi kullanabilir ve detayları görüntüleyebiliriz.

class Program

    {

        static void Main(string[] args)

        {

            try

            {

                object o = null;

                Console.WriteLine(o.ToString());

                int a = 5, b = 10;

                Console.WriteLine(a + b);

            }

            catch (Exception ex)

            {

                Console.WriteLine("Hata alındı ancak program çalışmaya devam edecek.\n");

                Console.WriteLine("Hata mesajı : {0}\n", ex.Message);

 

            }

 

            Console.WriteLine("Program çalışmaya devam ediyor.");

        }

    }

image

Şimdi de finally bloğundan bahsedelim. finally bloğu kullanılmışsa, try veya catch’den sonra mutlaka bu bloğuna giriş yapılır.

class Program

    {

        static void Main(string[] args)

        {

            try

            {

                object o = null;

                Console.WriteLine(o.ToString());

                int a = 5, b = 10;

                Console.WriteLine("İşlem hatasız olarak gerçekleşti. Sonuç : {0}", a + b);

            }

            catch

            {

                Console.WriteLine("Hata alındı ve catch bloğu çalıştı");

            }

 

            finally

            {

                Console.WriteLine("finally bloğu çalıştı");

            }

 

            Console.WriteLine("Program çalışmaya devam ediyor.");

        }

    }

ToString() metodu çağrısı sırasında hata oluşacak ve catch bloğuna giriş yapılacaktır. Daha sonra finally bloğuna girilecek ve sonrasında program kaldığı yerden çalışmaya devam edecektir.

image

Bu noktada değerli bir hocamın sormuş olduğu bir soruyu da ele almak istiyorum. Dikkat ederseniz try ya da catch bloğuna giriş yapıldıktan sonra program alt satırlardan çalışmaya devam ediyor. Aklımıza şöyle bir soru takılmış olabilir. catch’in altındaki kod her türlü çalışıyor, finally bloğunu yazmaya gerek var mı ?

class Program

    {

        static void Main(string[] args)

        {

            try

            {

                object o = null;

                Console.WriteLine(o.ToString());

                int a = 5, b = 10;

                Console.WriteLine("İşlem hatasız olarak gerçekleşti. Sonuç : {0}", a + b);

            }

            catch

            {

                Console.WriteLine("Hata alındı ve catch bloğu çalıştı");

            }

 

            //finally

            //{

            //    Console.WriteLine("finally bloğu çalıştı");

            //}

 

            Console.WriteLine("finally bloğunun yerine yazılan satır çalıştı");

 

            Console.WriteLine("Program çalışmaya devam ediyor.");

        }

    }

Yukarıdaki kodu çalıştırırsak aynı sonucu elde edeceğiz. Ancak bu durum her zaman aynı sonucu doğurmayabilir. Ufak bir test yapalım.

class Program

    {

        static void Main(string[] args)

        {

            Test(5, 10);

        }

 

        static void Test(int a, int b)

        {

            try

            {

                Console.WriteLine("İşlem hatasız olarak gerçekleşti. Sonuç : {0}", a + b);

            }

            catch

            {

                Console.WriteLine("Hata alındı ve catch bloğu çalıştı");

 

            }

            finally

            {

                Console.WriteLine("finally bloğu çalıştı");

            }

                       

            Console.WriteLine("Test metodu hala çalışıyor.");

        }

    }

image

class Program

    {

        static void Main(string[] args)

        {

            Test(5, 10);

        }

 

        static void Test(int a, int b)

        {

            try

            {

                Console.WriteLine("İşlem hatasız olarak gerçekleşti. Sonuç : {0}", a + b);

            }

            catch

            {

                Console.WriteLine("Hata alındı ve catch bloğu çalıştı");

 

            }

 

            Console.WriteLine("finally bloğunun yerine yazılan satır çalıştı");

 

            Console.WriteLine("Test metodu hala çalışıyor.");

        }

    }

image

Buraya kadar herşey normal görünüyor. Şimdi kodumuzu aşağıdaki gibi değiştirelim.

class Program

    {

        static void Main(string[] args)

        {

            Test(5, 10);

        }

 

        static void Test(int a, int b)

        {

            try

            {

                Console.WriteLine("İşlem hatasız olarak gerçekleşti. Sonuç : {0}", a + b);

                return;

            }

            catch

            {

                Console.WriteLine("Hata alındı ve catch bloğu çalıştı");

                return;

 

            }

 

            Console.WriteLine("finally bloğunun yerine yazılan satır çalıştı");

 

            Console.WriteLine("Test metodu hala çalışıyor.");

        }

    }

Programı çalıştıralım.

image

Zaten kodumuzdan da belli olduğu üzere, try ve catch bloklarındaki return ifadeleri sebebiyle alt satırlardaki kodların çalışmayacağını görüyoruz. Ancak finally bloğu kullansaydık, return ifadesi olmasına rağmen bu bloğa giriş yapılacaktı.

class Program

    {

        static void Main(string[] args)

        {

            Test(5, 10);

        }

 

        static void Test(int a, int b)

        {

            try

            {

                Console.WriteLine("İşlem hatasız olarak gerçekleşti. Sonuç : {0}", a + b);

                return;

            }

            catch

            {

                Console.WriteLine("Hata alındı ve catch bloğu çalıştı");

                return;

 

            }

            finally

            {

                Console.WriteLine("Hani return yazmıştık ??? Finally bloğu çalıştı.");

            }

 

            Console.WriteLine("Test metodu hala çalışıyor.");

        }

    }

Ekran çıktısını inceleyelim.

image

try, catch ve finally bloklarının çalışma mantığını basit olarak ele almaya çalıştık, faydalı olması dileği ile…



5 yorum:

murat akbulut dedi ki...

Anlatımın için teşekkürler gayet yalın ve anlaşılır.

Unknown dedi ki...

teşekkürler güzel anlatım

Unknown dedi ki...

teşekkürler güzel anlatım

Unknown dedi ki...

Abi senin Yazilarini Hep okuyorum cox guzel herseyi anlatiyorsun herseyiyle cox sagol eline saglik

Adsız dedi ki...

Güzel anlatım...ama keşki daha kapsamli problemlerin halline de dokunsaydın

Yorum Gönder