Bu site emekli olmuştur. Arşiv amaçlı olarak BT AKADEMİ sponsorluğunda yayın hayatına devam etmektedir.




C#nedir?com
 
YAZAR HAKKINDA
Resul Çavuşoğlu
Resul Çavuşoğlu
http://www.resulcavusoglu.com
İletişme geçmek için tıklayın.
4 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler: exception farkli finally gereken istisna istisnalar istisnalari istisnanin main(string[] meydana ortaya sifira siniflar static yukaridaki C# / VC#/.NET Resul Çavuşoğlu
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : Başlangıç
Kategori : C# / VC#/.NET
Yayınlanma Tarihi : 23.6.2004
Okunma Sayısı : 43173
Yorum Sayısı : 0     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
emre TAŞ
Silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Turhal Temizer
Conda install environment.yml Package 30.12.2024
Turhal Temizer
Mac OS/X Removing CUDA 30.12.2024
Burak Selim Şenyurt
Rust ile ECS Yaklaşımını Anlamak 30.12.2024
Burak Selim Şenyurt
Birlikte Rust Öğrenelim Serisi 30.12.2024
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Uzman Abi
Her Yönüyle C# - Sefer Algan
İstisnalar - 1 ( Exception)
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon
İstisna (Exception)kavramı programlama açısında büyük bir önem taşımaktadır. Bütün gelişmiş programlama dillerinde istisnaları yönetmek için çeşitli yöntemler ortaya konulmuştur. Bu yöntemler birçok açıdan benzerlikler gösterse de, çeşitli farklılıklar da bulunmaktadır. Öncelikle istisna kavramını bir inceleyelim.

İstisnalar, programımızın çalışma zamanında yani program çalışırken ortaya çıkan olağan dışı durumlardır. Programcılık dilinde "programın kırılması" ile adlandırılan olaylarda aslında bir istisnanın meydana geldiğini göstermektedir. Örneğin bir sayının sıfıra bölünmesi "DivisionDivideByZeroException" istisnasının ortaya çıkmasına sebep olmaktadır. Başka bir istisna örneği ise uyumsuz tipler arasında değer aktarımı gerçekleştirmeye çalışmaktır. Bir programcı olarak kod üzerinde her ne kadar detaylı çalışma yapsakta kullanıcı faktörü göz önüne alındığında çalışma zamanı hatalarının ( Runtime Error ) ortaya çıkması olasıdır. Aşağıdaki örneğimiz, çalışma zamanında ortaya çıkabilecek bazı istisnaları göstermektedir.

using System;
namespace Exception1
{
       class Istisnalar
      {
           [STAThread]
           static void Main(string[] args)
           {
                  int sayi1 = 25;
                  int sayi2 = 0;
                  int sonuc = 0; sonuc = sayi1 / sayi2;   // Sıfıra bölünme hatası
                  sonuc = int.Parse("selam");                // Tür dönüşüm hatası
                  myobj.ToString();                            // Null referance hatası
           }
       }
}

Bu ve benzeri bir çok hata .NET platformu tarafından izlenmekte ve gerekli istisnalar ortaya çıkartılmaktadır. İstisnalar iki şekilde ortaya çıkar.

1. Yazılım geliştirici "throw" ifadesini kullanarak kendi istisnası ortaya çıkartabilir.
2. Yukarıdaki örneklerimizde de ortaya çıkan ve programımızın normal olarak devamını sürdürmesini engelleyecek hatalardır.

Bu makalemizde programımızın normal işleyişini bozan istisnaları yönetmeyi inceleyeceğiz. Bu noktada unutulmaması gereken ilk nokta istisna yönetimi performans açısından pahalı bir seçenektir. Bu nedenle programcılıkta ilk seçeneğimiz programımıza giriş yapan bütün değerleri maskeleme, büyüklük ölçümü, tip uyum denetimlerini gibi mekanizmalarla denetlemektir. Gereksiz yere kullanılacak istisna yönetimi büyük performans kayıplarına neden olmaktadır. .NET ortamında her şey gibi istisnalarda sınıflar kullanılarak oluşturulmakta ve tüm istisnalar temel System.Exception nesnesinden türetilmektedir. Farklı istisnalar için farklı sınıflar bulunmaktadır. Bu istisna sınıfları veritabanı istisnalarından bellek istisnalarına kadar her alanda bulunmaktadır. Her istisna sınıfı kendine özgü bazı bileşenleri bünyesinde barındırmaktadır.

İstisnaları ortaya çıkartmak ve bu istisnaları yakalayıp yönetmek ayrı işlerdir. Bu makalemizde ortaya çıkmış olan istisnaları yakalamayı ve yönetmeyi işleyeceğiz. Bir istisnayı yakalamak için öncelikle istisnanın ortaya çıkabileceği kod aralığını tespit etmek gerekir. Bu işlem gerçekleştirildikten sonra aşağıdaki ifadelerden birini kullanarak istisna yakalama işlemi gerçekleştirilir.

1. try catch

2. try finally

3. try catch finally

try catch:

using System;
namespace Exception1
{
       class Istisnalar
      {
           [STAThread]
           static void Main(string[] args)
           {
                  int sayi1 = 25;
                  int sayi2 = 0;
                  try
                  {
                         int sonuc = 0; sonuc = sayi1 / sayi2;   // Sıfıra bölünme hatası
                         Console.WriteLine("Hiç Bir Hata Oluşmadı");
                  }
                  catch (Exception e)
                  {
                        Console.WriteLine(e.Message);
                  }
                  
           }
       }
}

Try Catch ifadelerinde örneğimizde de gördüğümüz gibi istisnanın ortaya çıkması muhtemel olan kod alanı try{......}catch parantezleri arasına alınmıştır. Bu kod artık izlenmektedir. Peki bir istisna ortaya çıktığı zaman nasıl bir olay meydana gelecektir. Parantez içerisinde bir hata meydana geldiğinde; hatanın ortaya çıktığı noktadan sonraki kodlar işleme konulmaz ve parantezden sonraki kod işleme alınır. Yukarıdaki örneğimizde Console.WriteLine("Hiç Bir Hata Oluşmadı"); kod satırı işleme konulmadan catch ifadesine atlanır. catch ifadesi adındanda anlaşılacağı gibi istisnaların yakalanıp seviyelendirildiği alandır. Daha öncede bahsettiğimiz gibi bütün istisna nesneleri Exception sınıfından türetilmiştir. Bu nedenle bütün hatalar Exception nesnesi tarafından yakalanabilmektedir. Exception sınıfı bünyesinde çeşitli özellik ve metotlar barındırmaktadır. Bu özelliklerden en önemlisi Message özelliğidir. String tipinde olan bu özellik istisna sonucu üretilen bilgi mesajını içermektedir. Yukarıda ki örneğimizde Attempted Divide by Zero bilgi mesajı ortaya çıkmaktadır. Peki bu try {..} bloğu içinde bir kaç çeşit hata meydana gelse ve bu hatalardan istediğimizi yakalamak istersek ne yapmamız gerekir.

using System;
namespace Exception1
{
       class Istisnalar
      {
           [STAThread]
           static void Main(string[] args)
           {
                  int sayi1 = 25;
                  int sayi2 = 0;
                  string txt;
                  try
                  {
                         txt = Console.ReadLine();
                         sayi2 = int.Parse(txt);
                         int sonuc = 0;
                         sonuc = sayi1 / sayi2;   // Sıfıra bölünme hatası
                         Console.WriteLine("Hiç Bir Hata Oluşmadı");
                  }
                  catch (DivideByZeroException e)
                  {
                        Console.WriteLine(e.Message);
                  }
                  catch (FormatException e)
                  {
                        Console.WriteLine(e.Message);
                  } 
                  
           }
       }
}

Yukarıdaki örneğimizde try{} bloğu içinde 2 çeşit hata ortaya çıkma ihtimali vardır. Bunlardan birincisi klavyeden girilen değerin int.Parse(txt) metodu ile stringten integer türüne dönüşümünde alfanümerik karakterlerden dolayı FormatException istisnanıs ve ikincisi girilen değerin 0 olması durumunda DivideByZeroException istisnasının ortaya çıkmasıdır. Örneğimizde de görüldüğü gibi programımız farklı hatalar için farklı davranmasını istiyorsak hata yakalama işini bir kaç seviyede gerçekleştirerek amacımıza ulaşabiliriz. Burda dikkat edilmesi gereken nokta özel olarak seçilen istisna sınıfları dışında örneğin yukarıda bir nullreferance gibi bir hata oluştuğu taktirde yakalanamayacak olduğudur. Bütün hataları yakalamak gereken durumlarda Exception temel sınıfını kullanmak gereklidir.

try finally:

İstisna takibinde Try finally bloğunun özelliği; hata ortaya çıksa da çıkmasa da bu finally bloğunun çalışıyor olmasıdır. Try{} bloğu içerisinde bir istisna ortaya çıktığında kodumuz aynen try catch ifadesinde olduğu gibi hatanın ortaya çıkmış olduğu noktadan sonraki kodlar çalışmadan finally bloğuna geçilir. Catch ifadesinden farklı olarak hatanın çeşidinin tespiti mümkün değildir. Finally bloğu programlarımızda kullanım sebebi try {} içerisinde yaratmış olduğumuz nesnelerin sonlandırılması veya değişkenlerin son değerlerinin belirlenmesi gereken durumlarda kullanılır.

using System;
namespace Exception1
{
       class Istisnalar
      {
           [STAThread]
           static void Main(string[] argös)
           {
                  int sayi1 = 25;
                  int sayi2 = 0;
                  try
                  {
                         int sonuc = 0; sonuc = sayi1 / sayi2;   // Sıfıra bölünme hatası
                         Console.WriteLine("Hiç Bir Hata Oluşmadı");
                  }
                  finally
                  {
                        Console.WriteLine(e.Message);
                  }
                  
           }
       }
}

Bu kullanıma bir örnek vermemiz gerekirse bir veritabanı bağlantısı yapıp geriye bazı değerler döndüren bir fonksiyon olsun. Bu fonksiyon içerisinde veritabanı bağlantısı gerçekleştirilip gerekli data çekim işlemleri meydana geldikten sonra bağlantının kesilmesi gerçekleştirilecektir.

using System;
namespace Exception1
{
       class Istisnalar
      {
           [STAThread]
           static void Main(string[] argös)
           {
               DataAl();                     
           }
           public string DataAl()
           {
                  string bilgi;
                  Baglan();
                  try
                  {
                        bilgi = getdata();
                  }
                  finally
                  {
                        baglantiyikes();
                        return bilgi;
                  }
           }
       }
}

Örneğimizde benzer bir yapı bulunmaktadır. Yukarıdaki gibi bir yapı veritabanı bağlantısının kesilecek olması kesindir. Bu yöntemle fazla kaynak kullanımı gibi etkilerden kurtulmamız mümkündür.

try catch finally:

try catch ve try finally ifadelerinin ve kullanım yeteneklerinin birleşerek ortak bir ifade halini aldığı kullanıma try catch finally diyoruz. Bu yöntem kullanılarak hatalar izlenip ayıklanabilmekte; bununla birlikte finally bloğunu yetenekleri kullanılarak kaynak kullanımı denetim altında alınabilmektedir.

using System;
namespace Exception1
{
       class Istisnalar
      {
           [STAThread]
           static void Main(string[] argös)
           {
               DataAl();                     
           }
           public string DataAl()
           {
                  string bilgi;
                  Baglan();
                  try
                  {
                        bilgi = getdata();
                  }
                  catch(Exception e)
                  {
                        bilgi = e.Message +" Hatası Oluştu";
                  }
                  finally
                  {
                        baglantiyikes();
                        return bilgi;
                  }
           }
       }
}



Gelecek makalemizde Exception sınıfı ve bu sınıftan türetilmiş sınıflar hakkında bilgi vereceğiz. Bununla birlikte isteğimize bağlı kendi istisnalarımızı nasıl ortaya çıkartacağımızı göreceğiz.

Resul ÇAVUŞOĞLU
[email protected]

Makale:
İstisnalar - 1 ( Exception) C#, Visual C# ve .NET Resul Çavuşoğlu
  • Yazılan Yorumlar
  • Yorum Yaz
Bu konu hakkında yayınlanan yorum bulunmamaktadır.
"Yorum Yaz" tabını kullanarak sizde yorumlarınızı yazabilirsiniz.
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • Eklenen Son 10
  • Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor