Merhabalar.

Dart eğitimlerimize hata yakalama işlemleri ile devam ediyoruz.

Bir program yazarken çalışma anında pek çok hata ile karşılaşabiliriz. Program çalışma anında bir hata alırsa hatayı bize gösterir ve sonrasında kapanır.

Kullanıcı tarafında çok da hoş karşılanmayacak bir durum. Şöyle bir şey düşünün bir mobil uygulamada sayı girilmesi gereken yere metinsel ifade girdiniz uyarı gözünüzden kaçmış ve birden hata alıyorsunuz ve program kapanıyor. Bu kullanıcı olarak hiç istemeyeceğimiz bir durumdur.

İşte böyle bir durumla kullanıcıyı baş başa bırakmamak için yazılımcı olarak bazı durumlarda hataları öngörüp bu hataları çalışma anında kullanıcıyı programı sonlandırmadan bildirip kaldığı yerden devam etmesini sağlamamız gerekir.

Bunun için try on, try catch ve try catch finally ifadelerinden yararlarınız.

Try{

Olaylar…

} On Hataİsmi{

Olaylar…

}

Bazı oluşabilecek hataların isimlerini biliriz ve o hata gerçekleşirse şu işlemi yap diyeceğimiz durumlar olur. Bunun için Try On yapısı kullanılır.

Öncelikle bir hata alan kod blogunu kontrol mekanizması kurmadan yazıp çalıştıralım.

void main(){
  
  int a = 5;
  int sonuc = 5 ~/ 0;
  
  print(sonuc);
  
}

Bir değer sıfıra bölünemez bu hatalı bir işlemdir. Burada yapmaya çalıştığımız işlem kod yazarken hata vermese de çalışma anında hata verecek.

Onu görelim.

Sıfıra bölünemez hatası ile karşı karşıya kaldık ve program durdu.

Şimdi sıfıra bölme hatasının ismini bildiğimize göre kodlarımızı şöyle yazabiliriz.

void main(){

  try{

    int a = 5;
    int sonuc = 5 ~/ 0;

    print(sonuc);
    
  } on IntegerDivisionByZeroException{
    
    print("Bir Sayıyı 0'a Bölemezsiniz");
    
  }


}

Try blogu içine çalışmasını istediğimiz kodları yazdık.

Eğer bu kodlar gerçeklenirken bir hata ile karşılaşırsak ve bu hatanın ismi sıfırabölünmehatası ise

on IntegerDivisionByZeroException kısmında bunu yakalıyoruz.

Ve bu hata kısmının süslü parantezleri içine kullanıcıya bilgi verebiliriz. Ya da hata aldığımızda ne işlem yapılmasını istiyorsak onu yazabiliriz.

Burada yazdığımız gibi.

H:\Dart_Tutorial\hello_dart\bin>dart 33_try_catch_finally.dart
Bir Sayıyı 0'a Bölemezsiniz

Gördüğünüz gibi ne program durdu ne hata geri döndü. Hata bölümünde bizim yazdığımız kodlar işledi ve ekranda o gözüktü.

Aklımıza bir soru geliyor ben almam olası olan tüm hata isimlerini bilmek zorundamıyım tabii ki hayır.

İşte bunun için try catch yapısını kullanacağız.

Onu da şöyle yazacağız.

void main(){

  try{

    int a = 5;
    int sonuc = 5 ~/ 0;

    print(sonuc);

  } on IntegerDivisionByZeroException{

    print("Bir Sayıyı 0'a Bölemezsiniz");

  }
  
  try{
    int c = 5;
    int sonuc2 = 5 ~/ 0;
  }catch(e){
    print("$e Hatası Oluştu");
  }
  
}
 try{
    int c = 5;
    int sonuc2 = 5 ~/ 0;
  }catch(e){
    print("$e Hatası Oluştu");
  }

try blogu içine gerekli işlemler yazılır.

Sonrasında catch blogu hatayı yakalamaya çalışır. Try içinde bir hata olursa bu catch parametresi e tarafından tutulur.

Catch blogu içinde ne yapılması isteniyorsa o kodlar yazılır.

H:\Dart_Tutorial\hello_dart\bin>dart 33_try_catch_finally.dart
Bir Sayıyı 0'a Bölemezsiniz
IntegerDivisionByZeroException Hatası Oluştu

Hatayla alakalı daha detaylı bilgi almak istersek catch’e e parametresinden sonra s parametresini gönderebiliriz.

void main(){

  try{

    int a = 5;
    int sonuc = 5 ~/ 0;

    print(sonuc);

  } on IntegerDivisionByZeroException{

    print("Bir Sayıyı 0'a Bölemezsiniz");

  }

  try{
    int c = 5;
    int sonuc2 = 5 ~/ 0;
  }catch(e, s){
    print("$e Hatası Oluştu \nDetaylar $s");
  }

}
 try{
    int c = 5;
    int sonuc2 = 5 ~/ 0;
  }catch(e, s){
    print("$e Hatası Oluştu \nDetaylar $s");
  }
H:\Dart_Tutorial\hello_dart\bin>dart 33_try_catch_finally.dart
Bir Sayıyı 0'a Bölemezsiniz
IntegerDivisionByZeroException Hatası Oluştu
Detaylar #0      int.~/ (dart:core-patch/integers.dart:22:7)
#1      main (file:///H:/Dart_Tutorial/hello_dart/bin/33_try_catch_finally.dart:18:20)
#2      _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:301:19)
#3      _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)

Peki aklımıza şöyle bir soru geliyor try içinde bir takım işler yaptık ve bir yerinde hata aldık yapılan o işlemler ne olacak?

Bunun için her ne olursa olsun çalışsın diyeceğimiz finally blogumuzu yazacağız.

Burada her ne olursa olsun çalışmasını isteyeceğiniz kodları yazabilirsiniz.

void main(){

  try{

    int a = 5;
    int sonuc = 5 ~/ 0;

    print(sonuc);

  } on IntegerDivisionByZeroException{

    print("Bir Sayıyı 0'a Bölemezsiniz");

  }

  try{
    int c = 5;
    int sonuc2 = 5 ~/ 0;
  }catch(e, s){
    print("$e Hatası Oluştu \nDetaylar $s");
  }finally{
    print("Mutlaka Çalışırım");
  }

}
try{
    int c = 5;
    int sonuc2 = 5 ~/ 0;
  }catch(e, s){
    print("$e Hatası Oluştu \nDetaylar $s");
  }finally{
    print("Mutlaka Çalışırım");
  }

H:\Dart_Tutorial\hello_dart\bin>dart 33_try_catch_finally.dart
Bir Sayıyı 0'a Bölemezsiniz
IntegerDivisionByZeroException Hatası Oluştu
Detaylar #0      int.~/ (dart:core-patch/integers.dart:22:7)
#1      main (file:///H:/Dart_Tutorial/hello_dart/bin/33_try_catch_finally.dart:18:20)
#2      _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:301:19)
#3      _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)

Mutlaka Çalışırım

Finally blogu herhangi bir hata almasak da çalışır unutmayalım.

Son olarak kendi hata sınıflarımızı yazabilir miyiz onlara bakalım.

Kendi hata sınıflarımızı yazmak için yazacağımız sınıfı Exception sınıfından implement etmemiz gerekir.

class MyException implements Exception{
  
  String HataliIslem(){
    return "Hatalı İşlem Yapıldı";
  }
  
}

Sınıfın içinde String tipli geriye değer döndüren bir metod yazıyoruz.

Hata sınıfımızı böylece ayarlamış olduk.

Şimdi bir para yatırma işlemi yaptıracağım bir sınıf yazacağım.

Ve eksi para yatırılamayacağı için eksi değer gönderilirse bir hata fırlatmasını sağlayacağım.

class ParaYatir{

  void Yatir(int a){
    if(a < 0){
      throw new MyException();
    }
    else print("İşlem Yapıldı");

  }
}

throw komutu ürettiğim türde sınıfın hata fırlatmasını sağlar.

Şimdi bunu main içinde yakalayalım.

import '29_polymorphism.dart';

void main(){

  try{

    int a = 5;
    int sonuc = 5 ~/ 0;

    print(sonuc);

  } on IntegerDivisionByZeroException{

    print("Bir Sayıyı 0'a Bölemezsiniz");

  }

  try{
    int c = 5;
    int sonuc2 = 5 ~/ 0;
  }catch(e, s){
    print("$e Hatası Oluştu \nDetaylar $s");
  }finally{
    print("Mutlaka Çalışırım");
  }

  try{
    int d = -12;
    ParaYatir p = ParaYatir();
    p.Yatir(d);
  }catch(e){
    print(e.HataliIslem());
  }


}

class MyException implements Exception{

  String HataliIslem(){
    return "Hatalı İşlem Yapıldı";
  }

}

class ParaYatir{
  void Yatir(int a){
    if(a < 0){
      throw new MyException();
    }
    else print("İşlem Yapıldı");
  }
}

try{
    int d = -12;
    ParaYatir p = ParaYatir();
    p.Yatir(d);
  }catch(e){
    print(e.HataliIslem());
  }

Burada e harfinden sonra noktaya bastığınızda metodun ismi görünmeyecektir. Siz kendiniz yazın. Herhangi bir hata vermeden çalışacaktır.

Sonuca bakalım.

H:\Dart_Tutorial\hello_dart\bin>dart 33_try_catch_finally.dart
Bir Sayıyı 0'a Bölemezsiniz
IntegerDivisionByZeroException Hatası Oluştu
Detaylar #0      int.~/ (dart:core-patch/integers.dart:22:7)
#1      main (file:///H:/Dart_Tutorial/hello_dart/bin/33_try_catch_finally.dart:20:20)
#2      _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:301:19)
#3      _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)

Mutlaka Çalışırım
Hatalı İşlem Yapıldı

Bu dersimiz de bu kadardı.

Bir sonraki yazımda görüşmek üzere.


What's Your Reaction?

hate hate
0
hate
fail fail
0
fail
fun fun
0
fun
geeky geeky
0
geeky
love love
0
love
lol lol
0
lol
omg omg
0
omg
win win
0
win
Murat Bilginer
21 Şubat 1992 Doğumlu. Endüstri Mühendisi olarak Lisansını 2016 yılında tamamlamıştır. Industryolog Akademi - NGenius oluşumlarının kurucusudur. Şu anda kendi şirketi Brainy Tech ile hem Yazılım Hizmetleri Sunmakta Hem de Online Eğitimler Vermektedir.