Application.Exception class’ını kullanarak kendimiz istisnai durumlar yaratabiliriz. Böylece bizim belirlediğimiz koşullarda da istisnai durum oluşmuş olur.
Class MyException Inherits Exception Public Sub New(ByVal Mesaj As String) Console.WriteLine("MyException oluştu.") End Sub End Class Sub Main() Try Throw New MyException("Hata Oluştu !") Catch ex As Exception Console.WriteLine("Şu hata yakalandı :{0}", ex.ToString()) End Try End Sub
class MyException : Exception { public MyException(string Mesaj) { Console.WriteLine(Mesaj); } }//MyException static void Main() { try { throw new MyException("Hata Oluştu !"); } catch (Exception ex){ Console.WriteLine("Şu hata yakalandı :{0}", ex.ToString()); } }//Main
Hata oluştu.
Şu hata yakalandı :MyException: Exception of type MyException was thrown. at OrnekKod.Main() in
Programımız içerisinde ölümcül bir hata oluştuğunda aktif bloğu daha önce işlediğimiz atlama ifadeleriyle(break, continue) sonlandırabiliriz. Böylece programın kırılmasını az zararla engellemiş oluruz.
System.Exception Üyeleri
İstisnai durumlar hakkında daha açıklayıcı bilgiler almak için System.Exception sınıfının üyelerini kullanırız. En çok kullanılan property’ler şunlardır;
HelpLink : Bu exception ile ilişkilendirilmiş web safyasının adresini tutar. Kendi tanımladığımız exceptionda bu property’i set edebiliriz.
InnerException : Asıl exception’dan kaynaklanan istisnayı okumak için kullanılır. Try içinde hata oluştuğu zaman catch’e atlar demiştik. Catch’de de meydana gelebilecek istisnayı öğrenmek için InnerException kullanılır.
Message : Hatanın nedenini açıklayan, hata kakkında bilgi veren içeriği bildirir.
Source : Hatanın oluştuğu class veya uygulamayı ifade eder. Eğer exception içinde Source property’si set edilmemişse geriye hatanın yazıldığı Assembly adı döner. Örneğin OverflowException hatası oluştuğunda source olarak mscorlib döner.
StackTrace : İşe yarar bilgilerden biri olarak stacktrace, hatanın oluştuğu dosyanın adını ve satır bilgisini açıklar.
TargetSite : Hataya sebep olan metodun adını döndürür.
'MyException Class Class MyException Inherits Exception Sub New(ByVal Mesaj As String) MyBase.New(Mesaj) End Sub Sub New(ByVal Mesaj As String, ByVal Inner As Exception) MyBase.New(Mesaj, Inner) End Sub End Class 'ExceptionYarat Class Class ExceptionYarat Sub HataUret() Throw New MyException("HataUret metodu hatalı işlem yaptı.") End Sub Sub HataYakala() Try HataUret() Catch ex As Exception Throw New MyException("HataYakala catch'i de hatalı işlem yaptı.", ex) End Try End Sub End Class 'Main Metodu Sub Main() Dim objOrnek As New ExceptionYarat 'ExceptionYarat.HataYakala içindeki catch'teki hatayı yakalamak için Main içinde try catch bloğu tanımlayalım. Try objOrnek.HataYakala() Catch ex As Exception Console.WriteLine("Oluşan Hata :{0}", ex.Message) Console.WriteLine() Console.WriteLine("Oluşan Hatanın InnerException'i :{0}", ex.InnerException) End Try End Sub
//MyException class class MyException : Exception { public MyException(string Mesaj) : base (Mesaj) {} public MyException(string Mesaj, Exception Inner) : base(Mesaj, Inner){ } } //ExceptionYarat class class ExceptionYarat { void HataUret() { throw new MyException("HataUret metodu hatalı işlem yaptı."); } public void HataYakala() { try { HataUret(); } catch (Exception ex) { throw new MyException("HataYakala catch'i de hatalı işlem yaptı.", ex); } } } //Main metodu static void Main() { ExceptionYarat objOrnek = new ExceptionYarat(); try { objOrnek.HataYakala(); } catch (Exception ex) { Console.WriteLine("Oluşan Hata :{0}", ex.Message); Console.WriteLine(); Console.WriteLine("Oluşan Hatanın InnerException'i :{0}", ex.InnerException); } }
Oluşan Hata :HataYakala catch'i de hatalı işlem yaptı.
Oluşan Hatanın InnerException'i :OrnekKod.MyException: HataUret metodu hatalı işlem yaptı.
at OrnekKod.ExceptionYarat.HataUret() in C:\OrnekKod\
at OrnekKod.ExceptionYarat.HataYakala() in C:\OrnekKod \
Görüldüğü gibi, Main() metodu içinden HataYakala() metodunun içindeki Catch bloğunda meydana gelen hataya erişmiş olduk. Eğer Main() içinde try catch kullanmamış olsaydık HataYakala() metodunun catch’inde meydana gelen hatadan dolayı program kırılırdı.
Hocam class içinde bir metodta Catch içinde yakaladığım hata mesajını nasıl farklı yerde kullanabilirim? Bu metodu bir formdan çağırıyorum. Class içinde metodta hata yakaladığım zaman hataya göre kullanıcıya MessageBox ile mesaj vermek, bilgilendirmek istiyorum. Direkt Class içinde MessageBox kullanabilirim ama bu şekilde programlama tekniklerine uygun olmadığını düşünüyorum. Metod geriye normalde bool döndürüyor ancak Catch içinde yakaladım hata mesajı string veya bazen int oluyor.
Kısacası Catch içinde yakaladığım hata mesajını kendisini çağıran Form’a nasıl geri döndürebilirim?
Olcay,
O Class içerisinde ErrorMessage diye bir property tanımlayabilirsin. Ve metod içerisinde catch bölümünde bu property’i güncelleyebilirsin. Metodu çağırdığın yerde de her defasında ErrorMessage property’sini kontrol edebilirsin hata var mı yok mu diye.
Veya bool türünde değer döndüren metoda aşağıdaki gibi “out” türünde bir değişken eklenebilir. Metodu çağırdıktan sonra bu parametreyi okuyabilirsin.
public bool MetodunAdı(String parametre1, out string errorMessage)
{
errorMessage = string.Empty;
try
{
….
}
catch (Exception ex)
{
errorMessage = ex.Message;
}
return true;
}