|
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
|