Kullanıcı Tanımlı Exception Türü (User-defined Exceptions)

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

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\ :line 30
at OrnekKod.ExceptionYarat.HataYakala() in C:\OrnekKod \
.vb:line 35

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

Kullanıcı Tanımlı Exception Türü (User-defined Exceptions)” üzerine 2 düşünce

  1. Olcay

    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?

    Cevapla
  2. Ahmet Kaymaz Yazar

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

    Cevapla

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Time limit is exhausted. Please reload CAPTCHA.