-

Exception Handling

1.      Exception Nedir?

Exception hata sayılabilecek ya da sayılmayacak yazılım veya donanım tarafından algılanan özel müdehale gerektiren programın çalışma ya da derlenme zamanında ortaya çıkabilcek herhangi beklenmedik durumdur.

Exceptionların Nedenleri

  • Donanımsal problemler,
  • Son kullanıcı kaynaklı,
  • Programlama mantığından gelen hatalar olabilir.

Sık Karşılaşılan Exceptionlar

  • Validasyonlarlara takılabilir,girilen veri geçersiz olabilir,
  • Network bağlantısı problemleri,
  • Veri tabanına bağlananamama sorunu,
  • Dosya path ini bulamama sorunu,
  • Tip dönüşüm hatası,
  • Dizi indexi dışında bir değer gelmesi,-1 gibi

2.      Exception Handling Nedir?

Hata algılandıktan sonraki özel müdehale sürecine exception handling,bu kod bloğuna da exception handler denir.Uygulamanın derleme veya çalışması sırasında ortaya çıkan herhangi bir sorun programla dili tarafından algılanır ve senaryoya göre önlemler alınır.Son kullanıcı bazlı problemler için ekrana uyarı verip hatayı düzeltmesini istemek örnek  verilebilir.

3.      Exception Handling Faydaları

  • Hata olduğu durumlarda hatayı giderdikten sonra program çalışmaya devam edebilir,
  • Hata olmadığı zamanlarda da performans kaybı olmaz,
  • Son kullanıcı kaynaklı bir hata ise kullanıcının hatayı gidermesine imkan tanır,
  • Exception Handling yazılımcının farklı durumlar üzerine düşünmesini sağlar.
Exception Handling Olmayan Dil Exception Handling Olan Dil:
Hata   meydana geldiğinde işletim sistemine gider mesajı gösterir ve programı   sonlandırır. Program   hatayı yakalar ve düzeltme şansı doğar bundan dolayı program sonlanması   yerine devam edebilir.

 

 

4.      Exception Handling Kontrol Akışı

Aşağıdaki akıştan da görebileceğimiz gibi kod akışı devam ederken bir hata olduğunda hata exception handlera iletilir.Handling senaryosana göre bir tepkide bulunur ve hata giderildiğinde kod akışına devam eder.

 se

5.      Exception Handling  Terminolojisi

Try

Try bloğu kaynak kodların normal şekildeki işleyişini içerir.Hata olmaz ise kod try bloğu içinde devam eder catch bloğuna girmeden sonlanır.

Catch

Hata olduğunda gireceği bloktur.Hata olduğu durumlarda ne yapılması isteniyorsa bu bloğa eklenir.Farklı hata tipleri için farklı tepki vermesi istenirse birden fazla catch bloğu eklenebilir.Catch blokları sırayla okunur, hangisinin bloğuna ilk girerse onun hatasını fırlatır.Her bir catch bloğuna tek parametre verilebilir ve parametreler tekil(unique) olmalıdır.

Finally

Kod akarken try veya catch bloklarından birinin içine girer,bunlardan bririne girdikten sonra kısıt olmaksızın finally kod bloğunu işler.

Throw

Throw un kelime karşılığı fırlatmadır.Hata meydana geldiğinde ne göstereceği ya da ne göndereceğine karar verir.Kütüphanelerdeki hazır throw ları kullanabileceğimiz gibi hata durumunda kendi özel throw umuzu da fırlatmasını isteyebiliriz.

6.      Farklı Dillerde Exception Handling

C++’da Exception Handling:

C++ diline 1990 yılında eklenmiştir.Temellerini  CLU,Ada ve ML den almaktadır. Bütün hatalar Exception sınıfından türer ve hatalı bir durum oluştuğunda program bu sınıfın bir nesnesini fırlatır.

Formatı aşağıdaki gibidir:

            try {

            — code that is expected to raise an exception

            }

             catch (formal parameter) {

            — handler code

            }…catch (formal parameter) { }

Formal parametreler hata bilgisini handlera iletmek için kullanılır.

Bir programda tanımlı olan hatalar fırlatılabilir,tanımsız olan bir hata görüldüğünde default exception olan unexcepted metodu çağırılır,bu da programı normal bir şekilde sonlandırır.

C++ Exception Hiyerarşisi

c++

Exception

description

bad_alloc thrown by new on allocation failure
bad_cast thrown by dynamic_cast when fails with a referenced   type
bad_exception thrown when an exception type doesn’t match any   catch
bad_typeid thrown by typeid
ios_base::failure thrown by functions in the iostream library

Java’da Exception Handling:

Temellerini OOP mimarisinden almıştır.Bütün hatalar Throwable sınıflarından türeyen sınıfların nesneleridir.

Java kütüphanesi Throwable için iki alt sınıf içerir:

java

  • Error

Yığın(heap) doluluğu gibi durumlarda Java yorumlayıcı tarafından fırlatılır

Kullanıcı programları tarafından handle edilemez.

  • Exception

Kullanıcı tarafından tanımlanan hatalar genelde bu alt sınıfa aittir.

İki tanımlı alt sınıfı vardır:IOExceptions ve RunTimeException.Örnek hatalar; ArrayIndexOutOfBoundsException and NullPointerException.

Try’ın syntaxi C++ daki gibidir.Hatalar c++ daki gibi throw ile fırlatılıyor.Çoğunlukla throw nesneyi oluşturmak new operatorü içerir.

throw new MyException();

Hata ve handlerın bağlantısı c++’dan daha kolaydır.

Hata geldiğinde handler yoksa program sonlandırılır.

Javadaki throws c++ daki throw dan oldukça farklıdır.Javadaki throws programcıya daha fazla ayrıntı verir.Error sınıfından ve RunTimeException türündeki ve onlardan türeyen bütün hatalara unchechked exception geriye kalanlara ise checked exception denir.Checked exception olanlar throws da geçiyordur ya da bir metod içinde handle ediliyordur.

public class ExcepTest{

   public static void main(String args[]){

      int a[] = new int[2];

      try{

         System.out.println(“Access element three :” + a[3]);

      }catch(ArrayIndexOutOfBoundsException e){

         System.out.println(“Exception thrown  :” + e);

      }

    finally{

         a[0] = 6;

         System.out.println(“First element value: ” +a[0]);

         System.out.println(“The finally statement is executed”);

      }   }  }

Output:

Exception thrown  :java.lang.ArrayIndexOutOfBoundsException: 3

First element value: 6

The finally statement is executed

Diller Arası Exception farklılıkları

Ortaya çıkan hatalar her dilde aynı etkiyi yaratmaz.

  • 0 a bölünme hatası C# dilinde DivisionByZero hatasını tetikler ama php ve javacsriptte kod akışını durdurmaz.
  • Javascriptte tanımlı olmayan bir fonksiyonu çağırmak exceptiona sebep olur ama php de aynı hata fatal error’a sebep olur kod akışı durur.

7.      Referanslar

  1. http://www.tutorialspoint.com/java/java_exceptions.htm
  2. http://www.cplusplus.com/doc/tutorial/exceptions/
  3. http://people.cs.aau.dk/~normark/oop-csharp/html/notes/exceptions-note-exception-hier-cs.html
  4. Exception Handling in C++,CS-2303 System Programming Concepts
  5. Concepts of Programming Languages,Robert W.Sebesta.Exception Handling Event Handling,Chapter 14
  6. Exception Handling, http://guvensahin.com/

C++ da Function Template-Class Template

  Templatein kelime anlamı taslaktır,c++ daki  kullanım şekli de kelime anlamına çok yakın bir kullanımdır. Fonksiyonu taslak olarak yazıyorsunuz ve  bu  fonksiyon farklı kullanım şekilleri  için esnek bir yapıya  sahip oluyor.

          C++ daki Function Template için  farklı tiplerde  kullanım esnekliği vardır.Bir  fonksiyonu farklı farklı tipler için ayrı ayrı yazmak yerine,tek bir  fonksiyon taslağı yazıp  bunu farklı tipler için kullanabilirsiniz.
          örneğin bir mutlak değer  fonksiyonun int veri tipi için şu şekilde yazarız:
        int mutlakdeger(int a){
      if(a<0)    return a;
       else return -a;
        }
      double veri  tipi için olanını şu şekilde yazarız:
        double  mutlakdeger(double  a){
      if(a<0)    return a;
       else return -a;
        }
     long olan için ;
            long  mutlakdeger(long  a){
      if(a<0)    return a;
       else return -a;
        }
               yani bütün tipler için ayrı ayrı yazardık.Bunu  taslak şeklinde yazıp  bütün veri tipleri için kullanabilmek istediğimiz   zaman yapmamız gereken şey fonksiyonu template  şeklinde tanımlamak.

  Template kulllanımı şu şekilde: 


template            //fonksiyonun başına yazılması gereken
T mulakdeger (T a)                    //yukarda tanımladığımız template Tyi  veri tipi olarak  kullandık

{

 if(a<0)    return a;
       else return -a;

}
int  main(){
cout<<”int veri tipi için mutlak deger alma”<
cout<<”double veri tipi için mutlak deger alma”<
}
bu şekilde kullanarak her veri tipi için ayrı yazma  gerekliliğinden kurtuluruz,kodlar kısalır fazla zaman  harcamak zorunda kalmayız.

 Template çeşitleri:

  •  template     //fonksiyonlar için kullanılır
  •  template                //classı template şekilde kullanabilmek için,daha çok data                storage classlarda(container)  kullanılır
  •  template       //birden fazla  tip tanımlayabiliriz
       Class Template:
            templateler ayrıca classlar için de kullanılabilir,işlev olarak  functşon template gibidir
           template
class  deneme{
                    //  classın diğer  elemanlarının prototypeları  yazılır
……………
       public int  denemefonk(T  ){}
………..
            };
            implementasyonlar:
         template
          deneme::denemefonk(T  a){………..}
           int main(){
         denemenesne;
          ………..
       }
  şeklinde kullanılır…………

DERYA GÜNDÜZ

c++ hata yakalama(try-catch)

c++daki hata yakalama olayı program içindeki istisnai durumları ayrı bir blok içinde tutup,programın çalışmasını engellemelesizi önlüyor.
bunu sağlayan en temel yapı da “throw”‘dur,throw ile hatalı ya da istisnai durumda ne yapması gerektiğini bildiyoruz ve main içinden try-catch yardımıyla hatalı durum zamanında çağırıyoruz.
örneğin bölme işlemi yapan bir program düşünelim, =a bölmek normalde hata verir ,0a bölme yapıldığında programın hata verip  durmasını engellemek için,kendimiz 0a  bölme yapması durumunda istediğimiz  durumu çalıştırıyoruz,
divide(int x,int y){
if(y==0) throw “0a bölme yapılamaz!”
return x/y;
}
int main(){
try{
divide(x,y)//bir problem yoksa normal bölme yapar
}
catch(string s){

cout<< s;//0a  bölme yapılmışsa üstte throw ilw yazılanı ekrana basar
}
}

kodun tamamına  burdan bakabilirsiniz
DERYA GÜNDÜZ

c++da polymorphism kavramı

polymorhism nedir?
polymorphism’in  türkçesi çokbiçimliliktir,
çok biçimlilik  sözcüğünü duyduğımuzda aklımıza  tek bir  şeyin farklı kullanımlara farklı yanıtlar vermesi  gelebilir.bunu sınıf kullanımına indirgediğimizde ise birbiriyle kalıtımla ilişkisi olan farklı sınıfların nesnelerinin aynı üye   fonksiyon çağrısına farklı yanıt vermesi  şeklinde açıklayabiliriz.
polymorphism nasıl kullanılır?
bunun için bir base classımız olmalı(temel sınıf),ve ondan kalıtımla oluşan derived classlar(türetilmiş sınıflar).
base classda oluşturulan bir  fonksiyon diğer sınıflarından hepsinde de kullanılacak ama bu  fonksiyonların herbirinin içeriği  farklı olacak.
base classda tanımladığımız ve bütün classlr için ortak kullanmak istediğimiz fonksiyonu base classda tanımlarken bunu “virtual”  olarak tanımlayıp,kullanmalıyız.diğer classlara  tanımlama  yaparken ise  normal tanımlama yapılmalıdır.
base classdaki tanımlama:
public  virtual string speak() const
kalıtılmış  sınıftaki tanımlama:
public string speak() const
mainde  bunu kullanacakken de alt sınıflardan nesne oluşturup bunu base classın pointerına ya  adresine eklemek  gerekir.
dog kucik  //dog derived class,pet  base class
pet *p1=&kucik
ya da
pet &p2=kucik
şeklinde kullanılır
polymorphismin ne fayda sağlar?
aynı fonksiyonu kullanacak yeni bir alt class eklendiğinde de  fonksiyonun içeriğini tekrardan yazmak zorunda kalmacağız.
bu  söylediğimiz  durum tabiki büyük projelerde avantaj sağlayacaktır,temel bir  içeriğie  sahip  fonksiyon var ve  buna herbir  oluşturulan classda yeni özellikler ekleniyor.

burda açıkladığım örnek kod var     tıklayıp   inceleyebilirsiniz.

DERYA GÜNDÜZ