Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
mustafamuratcoskun
GitHub Repository: mustafamuratcoskun/Sifirdan-Ileri-Seviyeye-Python-Programlama
Path: blob/master/Hatalar ve İstisnalar/Hata Yakalama - try,except,finally.ipynb
765 views
Kernel: Python 3

Hata Yakalama - try,except,finally

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ı

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.

Örnek 1

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

Örnek 2

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

try,except,finally blokları

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.

Hata fırlatmak

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.