Yazar girişi yapmak için tıklayın
ozgurclub banner

Exception lar CSharp.net

Exception ları biraz c# yazmaya başlayan herkes hemen hemen try catch blokları içindee kullanmıştır.

Exception lar Türkçe anlamı istisnalar çalışma zamanı hatalarını tespit etmemize ve yakalamamızı sağlarlar.
Bizim tanımladığımız veya sistem tanımlı bütün exception'lar System.Object temel sınıfından türeyen System.Exception Sınıfından türetilir..
Exception lar mantıksal hatalar , kullanıcı veya sistem hatalarından kaynaklanan anormal durumları 
Programın çalışması esnasında yakalamamızı sağlayan yapılardır. Şu Linkte
(Ekran Görüntüsü - 1) 
görmüş oldugunuz ekran görüntüsünü Object browser aracılğı ile  aldım(menu : view -> object browser). 
Exception sınfının nasıl bir yapıya sahip olduğunu anlamak adına bakılabilir. 
Temel olarak 2 interface den miras alan Exception sınıfımızın object browserdanda görünen 
/>gerçeğini bir kez daha yazarsak(virtual bildirgesi method un override edilebilir olduðunu gösterir)
public class Exception : ISerializable, _Exception
{// Public tanımlı yapıcı fonksiyonlar
public Exception(string message, Exception innerException);
public Exception(string message);
public Exception();
// Methodlar
public virtual Exception GetBaseException();
public virtual void GetObjectData(SerializationInfo info,StreamingContext context);
// Özellikler
public virtual IDictionary Data { get; }
public virtual string HelpLink { get; set; }
public System.Exception InnerException { get; }
public virtual string Message { get; }
public virtual string Source { get; set; }
public virtual string StackTrace { get; }
public MethodBase TargetSite { get; }
}
Açıklayalım ; Data: property si programcı tarafından tanımlanan Exceptiona özel bir bilgi dönderir.
HelpLink: adı üzerinde... InnerException: property mız varolan exceptionumuz dolayısyla meydan gelen önceki exceptionlarımız tutar.
bütün exceptionlarımız yapıcı fonksiyondan geçerken kaydedilebilir.
Message :   property mız yapıcı fonskiyonda set edilebilir veya varsayılan değerinde bırakılabilir...           
                 şayet Kendi Exception sınıfımızı yazıyorsa override edip kullanmakta akıllıca bir çözüm olur.
Source :      Property mız Exception la ilgili olan assemby mızın ismini geri dönderir.
StackTrace :Property sını basit şekilde ifade etmek gerekirse değişkenlerimizin ilgili çağrımlarımızın gerçekleştiği
stack in durumunu bize string olarak geri dönderir.         diyelim ki çalışma anında meydan gelen hatalarımızı stackın durumunu bir log dosyasında tutmak istiyoruz o zaman faydalı olabilir bir özelliktir.
TargetSite :Property si bize exceptionu fırlatan method la ilgili olarak bir dizi detay dönderir.ToSting() methodu ile yazdırmamız durumunda  methodunun ismini alırız.
System namespace ının içinde sistem tanımlı birçok exception yakalama mekanızması bulunmaktadır.
Bunlardan standart sistemexceptionları şunlardır.
System.OutOfMemoryException
System.NullReferenceException
System.InvalidCastException
System.ArrayTypeMismatchException
System.IndexOutOfRangeException
System.ArithmeticException

System.DevideByZeroException
System.OverFlowException

Ben bu yazımda anlaşılır olması için sıfıra bölme işlemiyle ilgili hataya değineceğim.
Basit bir şekilde giriş yaparsak
int i = 5;            
int s = 0;            
 int t;          
try            
{             
   t = i/s;     
}  

 catch (Exception e)     
{                
//e=new Exception("Sifira bolme Hatasi");
 Console.WriteLine(e.Message); 
  Console.WriteLine(e.GetType());  

 }
Şekildeki kod bloğumuz sıfıra bölme hatasını yakalar istersek tanımlı exceptionumuzdan  new ile  şekildeki

yorum satırındada görüldüğü üzere yeni bir örnek yaratarak message property mızı yapıcı fonskiyonda set edebiliyoruz.

System namespace ının içinde birçok Exception  türü tanımlanmıştır.

Eğer Exceptionumuzun hangi Exception türü olduğunu öğrenmek istiyorsak

e.GetType ile exceptionumuzun türünü alabiliriz.

Şu Ekran görüntüsünde(Ekran Görüntüsü2) de görebileceğiniz üzere Exception ımım tipi
System.DivideByZeroException tipidir.
Programlarınız yazarken birden fazla Olası exception yakalama veya alma durumunuz varsa
birden fazla catch bloğu kullanarak.hatalarınıza hakim olabilirsiniz...       

 try        {            
 }            
catch(type ex)       mp;nbsp; ;   
{             

Console.WriteLine(ex.Message);           

}  
         catch (type e)           
{              
Console.WriteLine(e.Message);                 
}
Şekildeki kod blogunda görüldüğü üzere birden fazla catch kullanabiliyoruz
Bu kullanım örneğin olası OverflowException hatası veya sıfıra bölme gibi bir durumda kullanılabilir. (ilk aklıma gelen bu oldu :) ) 

Exceptionlarımızı programatik olarak throw anahtar kelimesiyle tanımlayabiliriz.
Diyelimki biziim yazdığımız programa özel bir durum söz konusu istediğimiz değişkenin O değere eşit olmasını istemiyoruz.
Bunun için aşağıdaki &ou  ml;rneği tasarladım...
for dongüsü içerisinde a değişkeni asla 5 eşit olamaz 

(bakınız ekran görüntüsü 3 )
c# kodu
try      {              

for (int a = 0; a < 10; a++) {
 if (a == 5)                       

throw new Exception("Üzgünüm a 5 eşit olamaz");
Console.WriteLine("a = {0}",a);            
}          
}            
catch(Exception e) 
< ;em>{           
 Console.WriteLine(e.Message); 

}           
Console.ReadLine();
hatalarımızı yakalmak için Exception sınıfımızda miras olan bir başka sınıf daha yazabiliriz 

class Hatam : Exception {       
 public override string Message      

{            get            

{                return "Message özelliğini override ettim";     
}    
 }      
public Hatam()
{            
Console.WriteLine("benim yakladıgım hata mesajıdır"); 
}  }  
class Program  
{      

static void Main(string[] args)      
{           
 try  {               
for (int i = 0; i < 10; i++)         
{                 

Console.WriteLine(i);              
 if (i == 6)                
{                      
throw new Hatam();
}           
 }//end for          
}  catch (Hatam e)
{             
Console.WriteLine(e.Message);      
}        
Console.ReadLine();

 } 

}

Yukarıdaki koddada görüldüğü üzere yeni bir sınıf yazarak Hatam isimli Exception sınıfını miras aldım yapıcı
fonskiyonda gerekli mesajımı yazdırdım yakaldıgımız hatayı try catch blogunda gösterdim...
tabi Hatam sınıfı içerisinde message property sını override ettim
ekran çıktısı 4

Bu yazımda elimden geldiğinde .net Exception sınıflarına değinmeye çalıştım..

Artık Hata mesajlarınıza daha hakim olabilirsiniz ...

Herkese iyi kodlamalar

Özgür Demirel 
demirelozgur@gmail.com

Kategori : C#.Net
Etiketler : exception ,
Tarih : 20.06.2010
Ekleyen : ozgur

Tasarım ve Kodlama && SonDefterim.com Sürüm 1.1