Merhaba. Bu yazımda sizlere Python’da hata yakalamayı yani try-except yapısından bahsedeceğim. Tabi bir çok yazılım dilinde bu yapı var ve kullanılmaktadır. Peki Python hata yakalamanın bize nasıl bir avantajı var?
Bir program oluşturulurken olası güvelik saldırılarına ve hatalı veri girişlerine karşı önlemleri almak
gerekmektedir. Öreğin bir kullanıcıdan adını girmesini istediğiniz alana özel karater girebilir. Tabi bunu
bir for yapısıyla kontrol edebilirsiniz. Bu durum olası bir hataın veya yanlış girilen bir verinin önüne geçmenizi
sağlar. Peki sayı girmesini istediğiniz durumlarda olacak. Kullanıcılar buraya metinsel ifadalerde girebilir.
Örneği input()
ile almış olduğunuz bir değeri sayı olup olamadığını kontrol etmede ve int değere
çevirmeden bir sayayı ile topladığıızda hata almanız olası. İşte bu hata durumlarının bir çoğunda nasıl davranılması
gerektiği işlemlerini try-except yapsı ile kordie edebilmekteyiz. Buna bir örnek verelim.
1 2 3 4 5 6 7 8 9 10 11 12 13 | sayi = int(input("Lütfen yaşınızı giriniz. : ")) if sayi < 18: print("Sisteme giriş yapabilmeniz için yaşınızın 18 ve üzeri olması gerekmetedir.") ###################Ekran Çıktısı########################### #Lütfen yaşınızı giriniz. : dfg #Traceback (most recent call last): # File "C:\Users\web-user\Desktop\python_document\calismalar\python-1.py", line 1, in <module> # sayi = int(input("Lütfen yaşınızı giriniz. : ")) #ValueError: invalid literal for int() with base 10: 'dfg' ###################Ekran Çıktısı########################### |
Bu programda kullanıcıdan yaşının girilmesi istenmiştir ama kullanıcı karater girişinde bulunmuştur ve ekrana çıktısında belirtilen hata mesajı alınmıştır şimdi try-except ile bunu önleyelim.
1 2 3 4 5 6 7 8 9 10 11 12 | try: sayi = int(input("Lütfen yaşınızı giriniz. : ")) if sayi < 18: print("Sisteme giriş yapabilmeniz için yaşınızın 18 ve üzeri olması gerekmetedir.") except: print("Lütfen bir rakam giriniz.") ###################Ekran Çıktısı########################### #Lütfen yaşınızı giriniz. : asfasdf #Lütfen bir rakam giriniz. ###################Ekran Çıktısı########################### |
Yukarıdaki örnektende anlaşılacağı gibi girilen bir hatalı veri sonrasında ölümcül bir hata basılmadı. Ölümcül hata yerine bizim vermiş olduğumuz hata mesajı basıldı.
Yukardaki except:
tanımlaması olası bütün hatalarda çalışacak ve aynı hata mesajını verecektir.
İsterseiz hataları sınıflandırabilir ve her hataya özgü bir mesaj verebilirsiniz. Bunu aşağıdaki örnekle anlatalım.
1 2 3 4 5 6 7 8 9 10 11 12 13 | try: sayi = int(input("Lütfen yaşınızı giriniz. : ")) if sayi < 18: print("Sisteme giriş yapabilmeniz için yaşınızın 18 ve üzeri olması gerekmetedir.") except ValueError: print("Bu alana sadece sayı girebilirsiniz") except: print("Tanımsız bir hata oluştu") ###################Ekran Çıktısı########################### #Lütfen yaşınızı giriniz. : dfg #Bu alana sadece sayı girebilirsiniz ###################Ekran Çıktısı########################### |
Yukarıdaki örnekte except ValueError:
kullanımı hatayı sınıflandırdığımız anlamına gelmektedir.
Bu hata mesaj sayı yerine harf girildiğinide çalışaktır. Yine diğer hatalarda ise except:
bloğunda
tanımlanan hata mesajı ekrana basılacaktır.
İsterseniz hataları aşağıdaki gibi gruplayabilirsiniz.
1 2 3 4 5 6 7 8 9 10 11 12 13 | try: sayi = int(input("Lütfen yaşınızı giriniz. : ")) if sayi < 18: print("Sisteme giriş yapabilmeniz için yaşınızın 18 ve üzeri olması gerekmetedir.") except (ValueError, ZeroDivisionError): print("Bu alana sadece sayı girebilirsiniz") except: print("Tanımsız bir hata oluştu") ###################Ekran Çıktısı########################### #Lütfen yaşınızı giriniz. : dfg #Bu alana sadece sayı girebilirsiniz ###################Ekran Çıktısı########################### |
except (ValueError, ZeroDivisionError):
hataları bu şekilde hataları gruplayabilir ve
ilgili hatalarda bu mesajı basabiliriz.
Python try-except-as Kullanımı
Bildiğiniz gibi bir hatayla karşılaşıldığıda hatanın adı yazdıktan sonra hata açıklaması alınmatadır. try-except-as yapısıyla bu hata açıklamalarınıda alabilirsiniz. Aşağıdaki örenekte sınayalım
1 2 3 4 5 6 7 8 9 10 11 12 13 | try: sayi = int(input("Lütfen yaşınızı giriniz. : ")) if sayi < 18: print("Sisteme giriş yapabilmeniz için yaşınızın 18 ve üzeri olması gerekmetedir.") except ValueError as hataContent: print("Bu alana sadece sayı girebilirsiniz") print(hataContent) ###################Ekran Çıktısı########################### #Lütfen yaşınızı giriniz. : f #Bu alana sadece sayı girebilirsiniz #invalid literal for int() with base 10: 'f' ###################Ekran Çıktısı########################### |
Anlaşıldığı gibi oluşan bir geçersiz değer karşında hata mesajı hata adında bir değişkene atanarak ilgili alanda mesejla basılmıştır.
Yine isterseniz hataları gruplarında da hata mesajlarını alabilirsiniz.
except (ValueError, ZeroDivisionError) as hataMesaj:
Bu şekilde her iki hatada da hata mesajı
hataMesajı değişkenine aktarılacaktır.
Python try-except-else Kullanımı
Bu yöntem hataları farklı try-except-else yapısına bölebilirsiniz. Tabi bu kullanım kodların parçalanmasıa sebeb olacağıdan sistemin yönetimini zorlaştıracaktır. Bunu örnek ile açıklayalım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | try: bolen = int(input("Lütfen bölen sayıyı giriniz :")) bolunen=int(input("Lütfen bölecek sayıyı giriniz :")) except ValueError: print("Bu alana sadece sayı girebilirsiniz") else: try: print(bolunen/bolen) except ZeroDivisionError: print("Sıfıra bölme hatası") ###################Ekran Çıktısı########################### #Lütfen bölen sayıyı giriniz :0 #Lütfen bölecek sayıyı giriniz :5 #Sıfıra bölme hatası ###################Ekran Çıktısı########################### |
1 2 3 4 | Yukardaki örnektede anlaşılacağı gibi öncelik değerleri string to int tipine çeviriyoruz. Eğer bu çevirme esnasında oluşan bir hata varsa <code>print("Bu alana sadece sayı girebilirsiniz")</code> mesajı ekrana basılacaktır. Else blogunda ise girilen sayıyı bölme işlemi yapılmaktadır. Burada bir sayı sıfıra bölünmeye çalışılırsa <code>print("Sıfıra bölme hatası")</code> mesajını ekrana basacaktır. |
Python try-except-finally Kullanımı
Finally yapısına diğer yazılım dillerinden de aşına olabilirsiniz. Çünkü bir çoğunda kullanılmaktadır. Hata ayıklama yapısında finally, hata olsun veya olmasın çalışır. Finally yapısını şahsen ben veritabanı bağlantısı açıldıktan sonra işlemin tamamlanması durumunda veya tamamlanamaması durumunda finally kısmında kapatmaktayım. Bunu aşağıdaki örenekle daha da iyi kavrayalım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | try: bolen = int(input("Lütfen bölen sayıyı giriniz :")) bolunen=int(input("Lütfen bölecek sayıyı giriniz :")) print(bolunen//bolen) except: print("Üzgünüm bir hata oluştu.") finally: print("Hata olsun veya olmasın ben işlem sonunda çalışırım.") ###################Ekran Çıktısı########################### #Lütfen bölen sayıyı giriniz :3 #Lütfen bölecek sayıyı giriniz :3 #1 #Hata olsun veya olmasın ben işlem sonunda çalışırım. ###################Ekran Çıktısı########################### |
Yukarıdaki örnekte program normal bir şekilde çalıştı ve finally bloğundaki mesajı ekrana bastı. Bu durum programda bir hata oluşması halindede çalışacaktır.
Python raise() Kullanımı
Hata ayıklama yapısında tanımlı hataları yönetebildiğimiz gibi kendimizde bir hata tanımlayabiliriz. Bunu aşağıdaki örnek ile daha iyi kavrayalım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | yas=int(input("Lütfen yaşınızı giriniz : ")) if yas<0: raise Exception("Sıfırdan küçük bir değer giremezsiniz.") elif yas>65: raise Exception("Senin sistemde ne işin var. Hayatın tadını çıkarmayabak.") elif yas>0 and yas<18: raise Exception("Sisteme 18 yaşından küçükler üye olamaz.") else: print("Sisteme Hoş Geldiniz.") ###################Ekran Çıktısı########################### #Traceback (most recent call last): # File "C:\Users\web-user\Desktop\python_document\calismalar\python-1.py", line 8, in <module> # raise Exception("Sisteme 18 yaşından küçükler üye olamaz.") #Exception: Sisteme 18 yaşından küçükler üye olamaz. ###################Ekran Çıktısı########################### |
Yukarıda 18 yaş altına ve 65 yaş üstüne ve aynı zamanda 0 ve altı bir değer girildiğinda sistem hatası tanımlamış bulunduk.
Raise ile hataları belirli gruplara dahil edebilir ve o gruplarda bu hataları basabilirsiniz. Aşağıdaki örnekle bunu pekiştirelim.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | try: yas=int(input("Lütfen yaşınızı giriniz : ")) if yas<0: raise Exception("Sıfırdan küçük bir değer giremezsiniz.") elif yas>65: raise Exception("Senin sistemde ne işin var. Hayatın tadını çıkarmayabak.") elif yas>0 and yas<18: raise Exception("Sisteme 18 yaşından küçükler üye olamaz.") else: print("Sisteme Hoş Geldiniz.") except Exception as hata: print(hata) ###################Ekran Çıktısı########################### #Lütfen yaşınızı giriniz : 5 #Sisteme 18 yaşından küçükler üye olamaz. ###################Ekran Çıktısı########################### |
Yukarıda bizim tanımlamış olduğumuz hatalar varsayılan Exception sınıfına dahil edildi ve mesajı
except Exception as hata
değikenine aktararak hata kontrolünü yapmış olduk.
İstersenin bu hataları ValueError hatasınıfınada tanımlayabiliriz. Aşağıdaki öreneğimizle daha iyi kavraylım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | try: yas=int(input("Lütfen yaşınızı giriniz : ")) if yas<0: raise ValueError("Sıfırdan küçük bir değer giremezsiniz.") elif yas>65: raise ValueError("Senin sistemde ne işin var. Hayatın tadını çıkarmayabak.") elif yas>0 and yas<18: raise ValueError("Sisteme 18 yaşından küçükler üye olamaz.") else: print("Sisteme Hoş Geldiniz.") except ValueError as hata: print(hata) ###################Ekran Çıktısı########################### #Lütfen yaşınızı giriniz : 5 #Sisteme 18 yaşından küçükler üye olamaz. ###################Ekran Çıktısı########################### |
Anlaşıldığı gibi hatalarımızı raise ValueError("")
ValueError sınıfımıza dahil ettik.
Python Assert Kullanımı
Assert ile AssertionError sınıfını tanımlayabiliriz. Aynı zamanda daha hızlı teksatırda hata mesajları oluşturabilir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | try: yas=int(input("Lütfen yaşınızı giriniz : ")) if yas<0: raise AssertionError("Sıfırdan küçük bir değer giremezsiniz.") elif yas>65: raise AssertionError("Senin sistemde ne işin var. Hayatın tadını çıkarmayabak.") elif yas>0 and yas<18: raise AssertionError("Sisteme 18 yaşından küçükler üye olamaz.") else: print("Sisteme Hoş Geldiniz.") except AssertionError as hata: print(hata) ###################Ekran Çıktısı########################### #Lütfen yaşınızı giriniz : 5 #Sisteme 18 yaşından küçükler üye olamaz. ###################Ekran Çıktısı########################### |
Farklı bir kullanımı aşağıda verilmiştir.
1 2 3 4 5 6 7 8 9 10 11 12 | isim=input("Lütfen adınızı giriniz : ") assert len(isim)!=0 ,"Lütfen kullanıcı adınızı giriniz." print("Hoş geldin {}".format(isim)) ###################Ekran Çıktısı########################### #Lütfen adınızı giriniz : #Traceback (most recent call last): # File "C:\Users\web-user\Desktop\python_document\calismalar\python-1.py", line 2, in <module> # assert len(isim)!=0 ,"Lütfen kullanıcı adınızı giriniz." #AssertionError: Lütfen kullanıcı adınızı giriniz. ###################Ekran Çıktısı########################### |
Evet hata ayıklamaları konusunda anlatacaklarım bu kadar. Faydalı olaması dileğiyle. BAŞARILAR.