3 Nisan 2013 Çarşamba

70 - Try Catch... Özel Durumlar...

.NET Platformu tarafından sağlanan özel durum kütüphanesi oldukça kapsamlıdır. .NET Platformunda birçok özel durum tanımlanmıştır ve yazılan herhangi bir programda bu özel durumlarla karşılaşma oranı son derece yüksektir. Örneğin, yazılan bir programda metinsel veriyi sayısal bir veriye dönüştürme özel durumu ile karşılaşılabilir. Bunun yanında int16 veri türüne sahip bir değişkene int32 kapsamındaki bir veriyi (overflow, taşma hatası) atama gibi bir özel durumla da karşılaşılabilir. Bunun gibi daha birçok özel durumla karşılaşma durumu söz konusudur. Karşılaşılan her bir özel durum için ayrı ayrı try-catch bloku yazmak elbette son derece mantıksızdır. Bunun yerine aynı try-catch blokunda farklı catch bölümler kullanılabilir.

Bazı özel durumlar aşağıda gösterilmiştir;
FormatException: Sayısal veri türüne sahip bir değişkene bir harf girilmesi veya atanması
OverflowException: Bir değişkene atanan veya girilen sayı, değişkenin tanımlandığı veri türünün alabileceği aralığın dışında kalması
ArgumentNullException: Sayısal veri türüne sahip bir değişkene null değerini atamak

Diğer özellik ise Finally Bloğudur...  Bir kodlamada bir özel durum oluşsa da oluşmasa da ifadenin her zaman çalıştığından emin olmanın yolu onu bir finally blokunun içine yazmaktır. Finally bloku, bir try blokundan hemen sonra ya da try blokundan sonraki son catch blokundan hemen sonra ortaya çıkar. Program finally blokuyla ilişkili try blokuna girdiği sürece finally bloku her zaman çalışacaktır.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication9
{
    class Program
    {
        static void Main(string[] args)
        {
            // Try Catch Bloğu ile özel durumların kontrolü ve Finally bloğu... 

            byte sayi1 = 0, sayi2 = 0; 

        tekrar: // Hata ile karşılaşılırsa bir daha buraya dönecek...
            Console.WriteLine("Sayıları Giriniz:");

            try
            {
                sayi1 = Convert.ToByte(Console.ReadLine());
                sayi2 = Convert.ToByte(Console.ReadLine());  
                Console.WriteLine("Toplama = " + Convert.ToString(sayi1 + sayi2));
            }
            catch (FormatException)
            {
                // Sayısal veri girmezseniz bu hata bloğu çalışıyor... Örneğin sayı girilecek yerde enter a basın ve deneyin...
                Console.WriteLine("Lütfen sayısal veriler giriniz...");
                goto tekrar;
            }
            catch (OverflowException)
            {
                // Byte 0-255 arası değer alır biliyorusunuz... Bu durumda 255 den büyük bir sayı girildiğinde bu hata mesajı ile karşılaşılır... 
                Console.WriteLine("Hata... Alanlara çok büyük sayılar giriyorsunuz...");
                goto tekrar;
            }
            finally
            {
                // Her halükarda bu kısım çalışacak... Try olsada, catch olsada değişmez... 
                Console.WriteLine("Not: Byte alanına 0-255 arası veri girilebilmektedir... ");
                Console.WriteLine("\n\n\n");
            }

            Console.ReadKey();
        }
    }
}