Bu konuda programlarımızda hata verebilecek kodları yakalayabildiğimiz try,except,finally bloklarını ve fonksiyonlarda kendi hatalarımızı nasıl fırlatacağımızı öğreneceğiz.
try ,except bloklarının yapısı şu şekildedir;
try:
Hata çıkarabilecek kodlar buraya yazılıyor.
Eğer hata çıkarsa program uygun olan except bloğuna girecek.
Hata oluşursa try bloğunun geri kalanındaki işlemler çalışmayacak.
except Hata1:
Hata1 oluştuğunda burası çalışacak.
except Hata2:
Hata2 oluştuğunda burası çalışacak.
//
//
//
Hemen try , except ile ilgili örneklerimize geçelim.
a = int("324234dsadsad") # Burası ValueError hatası veriyor.
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-2-8575229c6738> in <module>() ----> 1 a = int("324234dsadsad") # Burası ValueError hatası veriyor. ValueError: invalid literal for int() with base 10: '324234dsadsad'
try:
a = int("324234dsadsad") # Burası ValueError hatası veriyor.
print("Program burada")
except: # Hatayı belirtmezsek bütün hatalar bu kısma giriyor.
print("Hata oluştu") # Burası çalışır.
print("Bloklar sona erdi")
Hata oluştu Bloklar sona erdi
Burada a = int("324234sadsad") kodu sıkıntı verdiği için program bu bloktan çıkarak direk except bloğuna girdi ve "Hata oluştu" yazdı. try ,except bloğu bitince program ekrana "Bloklar sona erdi" yazdırdı.
try:
a = int("324234") # Burası normal çalışıyor
print("Program burada")
except ValueError: # Hatayı belirtirsek ValueError hatası bu kısma giriyor.
print("Hata oluştu") # Hata olmadığı için çalışmadı.
print("Bloklar sona erdi")
Program burada Bloklar sona erdi
Şimdi de 2 adet sıkıntı çıkaran kodumuz bulunsun. Birincisi ZeroDivisionError , diğeri ValueError hatası.
a = int("32434aaa")
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-11-42c3f7bd0a21> in <module>() ----> 1 a = int("32434aaa") ValueError: invalid literal for int() with base 10: '32434aaa'
print(2 / 0)
--------------------------------------------------------------------------- ZeroDivisionError Traceback (most recent call last) <ipython-input-12-41b41279a019> in <module>() ----> 1 print(2 / 0) ZeroDivisionError: division by zero
Şimdi de bu hataları yakalamaya çalışalım.
try:
a = int(input("Sayı1:"))
b = int(input("Sayı2:")) # Hata burada oluşuyor. ValueError'a bloğuna giriyoruz.
print(a / b)
except ValueError:
print("Lütfen inputları doğru girin.")
except ZeroDivisionError:
print("Bir sayı 0'a bölünemez.")
Sayı1:12 Sayı2:12sdasdad Lütfen inputları doğru girin.
try:
a = int(input("Sayı1:"))
b = int(input("Sayı2:"))
print(a / b) # Hata burada oluşuyor. ZeroDivisionError'a bloğuna giriyoruz.
except ValueError:
print("Lütfen inputları doğru girin.")
except ZeroDivisionError:
print("Bir sayı 0'a bölünemez.")
Sayı1:12 Sayı2:0 Bir sayı 0'a bölünemez.
try:
a = int(input("Sayı1:"))
b = int(input("Sayı2:")) # Hata verecek kod bulunmuyor.
print(a / b)
except ValueError:
print("Lütfen inputları doğru girin.")
except ZeroDivisionError:
print("Bir sayı 0'a bölünemez.")
Sayı1:12 Sayı2:34 0.35294117647058826
İstersek bu iki hatanın aynı except bloğuna girmesini sağlayabiliriz.
try:
a = int(input("Sayı1:"))
b = int(input("Sayı2:"))
print(a / b)
except (ValueError,ZeroDivisionError):
print("ZeroDivision veya ValueError hatası")
Sayı1:12 Sayı2:213213sadsadsadasd ZeroDivision veya ValueError hatası
try:
a = int(input("Sayı1:"))
b = int(input("Sayı2:"))
print(a / b)
except (ValueError,ZeroDivisionError):
print("ZeroDivision veya ValueError hatası")
Sayı1:12 Sayı2:0 ZeroDivision veya ValueError hatası
İşte burada gördüğümüz gibi bir kodda herhangi bir hata olduğunda try,except blokları ile hataları yakalayabiliyoruz.
Bazen programlarımızda her durumda mutlaka çalışmasını istediğimiz kodlar bulunabilir.Bunun için biz kendi try,except bloklarına ek olarak bir tane finally bloğu ekleyebiliriz. finally blokları hata olması veya olmaması durumunda mutlaka çalışacaktır. Yapısı şu şekildedir;
try:
Hata çıkarabilecek kodlar buraya yazılıyor.
Eğer hata çıkarsa program uygun olan except bloğuna girecek.
Hata oluşursa try bloğunun geri kalanındaki işlemler çalışmayacak.
except Hata1:
Hata1 oluştuğunda burası çalışacak.
except Hata2:
Hata2 oluştuğunda burası çalışacak.
//
//
//
finally:
Mutlaka çalışması gereken kodlar buraya yazılacak.
Bu blok her türlü çalışacak.
Hemen basit bir örnek yazalım.
try:
a = int(input("Sayı1:"))
b = int(input("Sayı2:"))
print(a / b) # Hata burada oluşuyor. ZeroDivisionError'a bloğuna giriyoruz.
except ValueError:
print("Lütfen inputları doğru girin.")
except ZeroDivisionError:
print("Bir sayı 0'a bölünemez.")
finally:
print("Her durumda çalışıyorum.")
Sayı1:12 Sayı2:213213aaaaa Lütfen inputları doğru girin. Her durumda çalışıyorum.
try:
a = int(input("Sayı1:"))
b = int(input("Sayı2:"))
print(a / b) # Hata burada oluşuyor. ZeroDivisionError'a bloğuna giriyoruz.
except ValueError:
print("Lütfen inputları doğru girin.")
except ZeroDivisionError:
print("Bir sayı 0'a bölünemez.")
finally:
print("Her durumda çalışıyorum.")
Sayı1:12 Sayı2:0 Bir sayı 0'a bölünemez. Her durumda çalışıyorum.
try:
a = int(input("Sayı1:"))
b = int(input("Sayı2:"))
print(a / b) # Hata burada oluşuyor. ZeroDivisionError'a bloğuna giriyoruz.
except ValueError:
print("Lütfen inputları doğru girin.")
except ZeroDivisionError:
print("Bir sayı 0'a bölünemez.")
finally:
print("Her durumda çalışıyorum.")
Sayı1:12 Sayı2:3 4.0 Her durumda çalışıyorum.
Bazen kendi yazdığımız fonksiyonlar yanlış kullanılırsa kendi hatalarımızı üretip Pythonda bu hataları fırlatabiliriz. Bunun içinde raise anahtar kelimesini kullanacağız. Hata fırlatma şu şekilde yapılabilmektedir;
raise HataAdı(opsiyonel hata mesajı)
# Verilen string'i ters çevirmek
def terscevir(s):
if (type(s) != str):
raise ValueError("Lütfen doğru bir input girin.")
else:
return s[::-1]
print(terscevir("Python")) # Hata vermiyor.
nohtyP
print(terscevir(12))
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-23-affc1a0b50fd> in <module>() ----> 1 print(terscevir(12)) <ipython-input-20-8f7e1cd7e827> in terscevir(s) 2 def terscevir(s): 3 if (type(s) != str): ----> 4 raise ValueError("Lütfen doğru bir input girin.") 5 else: 6 return s[::-1] ValueError: Lütfen doğru bir input girin.
Bu fonksiyondan fırlatılan hatayı da try,except bloklarıyla yakalayabiliriz.
try:
print(terscevir(12))
except ValueError:
print("Fonksiyonda bir hata oluştu.")
Fonksiyonda bir hata oluştu.
İşte Pythonda hata yakalama konusu bu kadar ! Artık hata yakalamayı kullanarak programlarımızı daha güvenli yazabiliriz.