Jump to content

C#.net - İstisnasi Durum & Yönetimi


wmismail

Recommended Posts

Tüm yazilimci arkadaşlara selamlar,

Bu makalemde .NET Framework Istisnai Durumlari ve C# dili ile istisnai durum yönetimi konularindan bahsedecegim.

Istisnai Durum nedir?

1000000642_Pencil.gif Istisnai durumlar programlarin çalisma zamaninda hata üretmeleri veya kodda beklenmedik durumlarin olusmasi sonucunda CLR tarafindan üretilirler. C dili gibi makinaya yakin dillerde bu tür hata kontrol mekanizmalari mevcut degildi.Visual Basic veya benzeri programciya yakin dillerde hatalari yönetmek için çesitli mekanizmalar mevcuttur.

"Peki C# hata yönetiminin farki nedir?" dediginizi duyar gibiyim.

Cevap, C# ile ilk tanismanizdan itibaren duydugunuz C# dilinin %100 nesneye yönelik bir dil olusu olacaktir.Somut bir örnek vermemiz gerekirse, C# ile istisna siniflarini kullanarak kendi istisna siniflarimizi olusturabiliriz.

.NET Framework'ünde istisnai durumlar Exception ile tanimlanirlar ve Exception sinifindan türeyen objelerle yönetilirler.Bunun yanisira C# %100 oop tabanli bir dil oldugundan dolayi Object sinifindan türeyen herhangi bir sinif Exception sinifi olarak kullanilabilir.

Bu kadar soyut kavramdan sonra isterseniz istisnai durumlarin C# dilindeki yazim kurallarindan nasıl yönetildiginden bahsedelim.

Yazim kurali

try

{

//Istisnai durum olusturabilecek kod

}

catch(OverflowException e)

{

//OverflowException Istisnai durum olustugunda çalisacak kod

}

catch(<Spesifik Istisnai durum sinifi> e)

{

//Spesifik Istisnai durum olustugunda çalisacak kod

}

catch(Exception e)

{

//Genel Istisnai durum olustugunda çalisacak kod

}

finally

{

//Istisnai durum olussun veya olusmasin çalisacak kod.

}

Istisnai durumu yaratabilecek kod try blogu içine yazilir.Catch blogunda ise istisnai durum olustugunda yapilmasi gereken işlemlere ait kod bulunur..NET framework'ünde Exception sinifindan türemis olan spesifik hatalara yönelik istisnai durum siniflari mevcuttur.Bu siniflari birden fazla catch blogunda tanimlayarak olusacak hatayi klasifike edebiliriz.Finally blogu içindeki kod ise istisnai durum olussun veya olusmasin çalisacak koddur.

Hernekadar istinai durum yaratabilecek kodu try blogu içinde yaziyor olsak da CLR programin herhangi bir noktasinda istisnai durumlar yaratabilir.Elimizde olmayan sebeplerden dolayi sistem kaynaklari kritik durumlara düsebilir, OutOfMemoryException istisnai durumu veya yazdigimiz kodun bir metodu tekrarli bir sekilde kendini çagirmasi sonucu StackOverflowException istisnai durumu olusabilir.

1000000642_Can.gif Try blogundan sonra catch veya finally bloklarindan biri gelmelidir.

Ilk try-catch'imiz

Asagidaki örnegimizi inceleyelim.

using System;

namespace Exceptions

{

class Class1

{

static void Main(string[] args)

{

try

{

int b=50000;

short a=0;

a=Convert.ToInt16(:dribble:;

}

catch(Exception e)

{

Console.WriteLine(e.Message);

}

}

}

}

Try blogu içinde Int16 türünden olan yani pozitif siniri 32767 olan bir degiskene 50000 değerini atamaya çalisiyoruz.Dolayisi ile istinai durumumuz olusuyor.Catch blogunda ise olusan istisnai durumun ürettigi mesaji kullaniciya gösteriyoruz.

Istisnai durum yaratma - Throw

Satis amaçli veya diger yazilim gelistiriciler için gelistirdigimiz bilesenlerde ilgili is kurallarina ters düsen durumlarda istisnai durumlar firlatmamiz gerekebilir.C# dilinde istisnai durum firlatmak için throw komutu kullanilir.

using System;

namespace Exceptions

{

class Class1

{

[sTAThread]

static void Main(string[] args)

{

try

{

throw new Exception("Hata olustu");

}

catch(Exception e)

{

Console.WriteLine(e.Message);

}

}

}

}

Exceptions sinifini kullanarak kendi istisnai durum siniflarimizi yaratmak

Gelistiridigimiz proje'nin konusu ve yapisi geregi kendi istisnai durumlarimizi olusturmamiz gerekebilir.Bu tür durumlarda .NET Framework'ü ile birlikte gelen Exceptions sinifini kullanarak kendi istisnai durum siniflarimizi yaratabilir bunlari projemizde kullanabiliriz.

using System;

namespace Exceptions

{

public class BizimException:Exception

{

public BizimException(String message) : base (message)

{

}

public BizimException(String message, Exception inner) : base(message,inner)

{

}

}

class Class1

{

[sTAThread]

static void Main(string[] args)

{

try

{

throw new BizimException("Hata olustu");

}

catch(BizimException e)

{

Console.WriteLine("Bu bizim yarattigimiz özel exception sinifi hatasi : " + e.Message);

}

catch(Exception e)

{

Console.WriteLine("Bu genel exception sinifi hatasi : " + e.Message);

}

}

}

}

Exceptions sinifinin 3 yapici metodu mevcuttur.Ilk metod hata mesajini string türünden bir parametre ile kabul eder, ikincisi hata mesaji ile birlikte bir üst istisnai durumu Exception obje türünden kabul eder.(inner parametresinin tam olarak ne ise yaradigini ilerleyen satirlarda daha iyi anlayacaksiniz).Üçüncü ve son metod ise herhangi bir parametre almaz.

Exceptions Sinifi

Simdi isterseniz Exception sinifinin üyelerini inceleyelim.

StackTrace

Hatanin nerede olustugunun detayli bilgisini içerir.Kaynak dosya ismi ve hatanin olustugu satir numarasini verir.

using System;

namespace Exceptions

{

class Class1

{

static void Main(string[] args)

{

try

{

int b=50000;

short a=0;

a=Convert.ToInt16(<_<;

}

catch(Exception e)

{

Console.WriteLine(e.StackTrace.ToString());

}

}

}

}

InnerException

Bazi zamanlar catch bloguna yazdigimiz kodda da hatalar olusabilir.Bu tür durumlarda olusan istisnai durumun içerdigi diger istisnai duruma erismek için innerexception üyesini kullaniriz.Biraz havada kaldiginin farkindayim, isterseniz örnegimizi inceleyelim.

1000000642_Board.gif using System;

using System;

public class BizimException:ApplicationException

{

public BizimException(String message) : base (message)

{

}

public BizimException(String message, Exception inner) : base(message,inner)

{

}

}

public class ExceptionOrnegi

{

public void InnerGonder()

{

throw new BizimException("InnerException hatamiz");

}

public void InnerYakala()

{

try

{

this.InnerGonder();

}

catch (Exception e)

{

throw new BizimException("InnerYakala metodunun olusturdugu hata.",e);

}

}

}

public class Test

{

public static void Main()

{

ExceptionOrnegi testEx = new ExceptionOrnegi();

try

{

testEx.InnerYakala();

}

catch(Exception e)

{

Console.WriteLine ("Bu catch blogunda yakalanan hata : {0}", e.Message);

Console.WriteLine ("Bu catch blogundaki e Exception sinifinin innerexception değeri : {0}",e.InnerException);

}

}

}

Kod biraz karmasik, kodu kisaca bir sema ile ele alırsak;

Ilk olarak Test sinifimizin Main metodu çalisacak ve yarattigimiz textEX isimli ExceptionOrnegi türünden sinifimizin InnerYakala metodunu çagrilacaktir.

InnerYakala metodu ise kendi içinde InnerGonder metodunu çagiracak ve Istisnai durum yönetimimiz bu metodda baslayacaktir.

InnerGonder metodu BizimException türünden "InnerException hatamiz" mesaj değeri içeren bir istisnai durum firlatacaktir.InnerGonder metodu ilk olarak InnerYakala metodundan çagirildigi ve bu metod try bloguna tabi oldugu için istisnai durum ilk olarak InnerYakala metodunda bulunan catch blogunca yorumlanacaktir.

InnerYakala blogundaki catch kodunda ise yeni bir BizimException türünden bir istisnai durum yaratiliyor fakat dikkat ederseniz 2. yapici metod kullaniliyor ve InnerGonder metodunun olusturdugu hata inner parametresi ile yeni olusturulan istisnai durum objesine gönderiliyor.

Son olarak imleç bütün bu karmasanin basladigi yere yani Test sinifimizin Main metodundaki catch bloguna ulasiyor.Catch blogundaki exception objesi InnerYakala metodunun firlattigi bir istisna oldugu için mesaj değeri "InnerYakala metodunun olusturdugu hata." seklindedir.Bu istisna objesinin inner özelligi sayesinde ise InnerGonder metodunda olusan istisnai durum objesine erisebiliyoruz.

Asagidaki sema örnekteki exception objelerinin değerlerini göstermektedir. 1000000642_trycatchinner.jpg

1000000642_trycatchinner1.jpg

Message

Kullaniciyi bilgilendirmek üzere hata hakkında detayli açiklama içerir.

HelpLink

Hata hakkında daha detayli bilgi veren URL bilgisi barindirir.

Source

Hatayi olusturan sinif hakkında bilgi verir.

1000000642_Board.gif using System;

namespace Exceptions

{

class Class1

{

[sTAThread]

static void Main(string[] args)

{

try

{

int b=50000;

short a=0;

a=Convert.ToInt16(:D;

}

catch(OverflowException e)

{

Console.WriteLine(e.Source.ToString());

}

}

}

} 1000000642_screen.jpg mscorlib

Press any key to continueTargetSite

Istisnai durumu olusturan metod hakkında bilgi içerir.

1000000642_Board.gif using System;

namespace Exceptions

{

class Class1

{

[sTAThread]

static void Main(string[] args)

{

try

{

int b=50000;

short a=0;

a=Convert.ToInt16(:D;

}

catch(OverflowException e)

{

Console.WriteLine(e.TargetSite.ToString());

}

}

}

} 1000000642_screen.jpg Int16 ToInt16(Int32)

Press any key to continueEvet bir makalenin daha sonuna geldik.Umarim yararlı olmustur.

Hepinize mutlu günler dilerim.

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...