Python Hata Yakalama Operatörü
Uzun bir sürenin ardından tekrar bir entry ile merhaba diyelim. Bu kez konu yine Python ve hata yakalama operatörü üzerine deyineceğim. Hata yakalama operatöründe amaç sistemin verdiği hataları yakalayıp farklı işlemler yapmak yada hataları düzeltmek. Örnek olarak pass ile boş geçebiliriz, print ile bir text verebilir yada hatayı düzeltmek gibi işlemler yapabiliriz.
Şahsen ben çok kullanıyorum. Özellikle veritabanı üzerinde işlemler yaparken kimi zaman kilitlenebiliyor, kimi zaman bir başka hata.. Bu tür hataları gizlemek için yada düzeltmek için bu operatörleri kullanabiliriz. Her neyse daha fazla uzatmadan bir örnek ile yarı baygın girelim konuya.
sayi_int = 3
sayi_str = "3"
toplam = sayi_int + sayi_str
print toplam
Yukardaki işlemde integer bir değer
ile string bir değeri toplamaya çalışıyoruz, fakat sistem bize
TypeError hatasını
belirtiyor.
sayi_str = "3"
toplam = sayi_int + sayi_str
print toplam
Traceback (most recent call last):
File "./wow.py", line 6, in <module>
toplam = sayi_int + sayi_str
TypeError: unsupported operand type(s) for +: 'int' and 'str
Aslında
çözüm gayet basit, string değişkeni toplarken int() fonksiyonunu
kullanabiliriz. Ama amacımız burada hata yakalamayı anlatmak. O
halde deyinelim artık konuya. Hatayı yakalamak istersek kaynak
kodumuz aşağıdaki gibi olmalı;File "./wow.py", line 6, in <module>
toplam = sayi_int + sayi_str
TypeError: unsupported operand type(s) for +: 'int' and 'str
sayi_int = 3
sayi_str = "3"
try:
toplam = sayi_int + sayi_str
except TypeError:
pass
print toplam
Try: operatörünü
doğru yere koymak çok önemli. Uçbirimde bize hangi satırda hata
var diyorsa ona göre koymalıyız. Try: ardından yapılacak olan
işlem geliyor, except: ile hatayı yakalamaya çalışıyoruz. Eğer
TypeError hatası
verecek olursa pass
geç, yani hatayı gösterme ve bir işlemde yapma anlamında. sayi_str = "3"
try:
toplam = sayi_int + sayi_str
except TypeError:
pass
print toplam
Tabii şuda var; except TypeError ile TypeError hatasını belirttik. İstersek hata türü belirtmeyiz, herhangi bir hata ile karşılaşırsak istediğimiz komutu verebiliriz. O halde sadece except: diyerek her hata türü için aynı işlemi yapabiliriz.
Birden fazla hata kodu alırsak hepsini tek bir except ile kapatmak yerine hepsine ayrı ayrı komutlar da verebiliriz. Örneğin;
sayi_int = 3
try:
toplam = sayi_int + sayi_str
except TypeError:
pass
print toplam
Yukardaki
örnekte de sayi_str değişkenini silerek sistemin bize NameError
hatasını vermesini sağladık. Daha önceden TypeError hatasını
except ile yakalayıp pass demiştik. Şimdi de aynısını NameError
için yapalım. Eğer her iki hata içinde aynı işlemleri
yapacaksak;try:
toplam = sayi_int + sayi_str
except TypeError:
pass
print toplam
sayi_int = 3
try:
toplam = sayi_int + sayi_str
except (TypeError,NameError):
pass
print toplam
şeklinde
yapabiliriz. Eğer ayrı işlemler yapacaksak;try:
toplam = sayi_int + sayi_str
except (TypeError,NameError):
pass
print toplam
sayi_int = 3
try:
toplam = sayi_int + sayi_str
except TypeError:
pass
except NameError:
print “Tanimsiz degiskenler bulunmakta.”
print toplam
şeklinde
de yapabiliriz. Peki az önce sayi_str değişkenini silmiştik.
Şimdi tekrardan string 3 değerini verelim. Ve şimdi toplama
yaparken except ile yakalayıp string 3'ü yani sayi_str'yi integer 3
olarak toplasın. Böylece hatayı kullanıcıya göstermeden
arkaplanda hatayı düzeltebiliriz;try:
toplam = sayi_int + sayi_str
except TypeError:
pass
except NameError:
print “Tanimsiz degiskenler bulunmakta.”
print toplam
sayi_int = 3
sayi_str = "3"
try:
toplam = sayi_int + sayi_str
except TypeError:
toplam = sayi_int + int(sayi_str)
print toplam
sayi_str = "3"
try:
toplam = sayi_int + sayi_str
except TypeError:
toplam = sayi_int + int(sayi_str)
print toplam
İşte
böyle. Biraz basit örneklerle kaldım, fazla açıklayıcı zaten
örnekler. O yüzden açıklamaya gerek duymuyorum. Belki anlatımım
kötü olabilir, varsa kusurumuz affola.
Dediğim gibi veritabanı işlemlerinde çok kullanıyorum bu operatörü. Bir örnek verecek olursam;
try:
testFor = c.execute("SELECT * FROM kelime WHERE kelime = ?",[kSecKelime])
for tFor in testFor:
print "\nKelime:" + str(tFor[1]) + "\nAnlami: " + str(tFor[2])
if tFor == "":
print "\nHATA: Aradığınız kelime veritabanında bulunmamaktadır."
kAN()
except sqlite3.OperationalError:
dbH()
kAN()
except sqlite3.ProgrammingError:
kYZ()
kAN()
testFor = c.execute("SELECT * FROM kelime WHERE kelime = ?",[kSecKelime])
for tFor in testFor:
print "\nKelime:" + str(tFor[1]) + "\nAnlami: " + str(tFor[2])
if tFor == "":
print "\nHATA: Aradığınız kelime veritabanında bulunmamaktadır."
kAN()
except sqlite3.OperationalError:
dbH()
kAN()
except sqlite3.ProgrammingError:
kYZ()
kAN()
Hemen
açıklayayım örneğimizi. testfor değişkenine
veritabanında aldığımız bilgileri atıyoruz. Daha sonra bu
bilgileri for yapısı ile bir diziye atıyoruz. Ardından print ile
yazdırıyoruz. if ifadesi bir kontrol yaparak belli bir işlemi
gerçekleştiriyoruz ve kAN() fonksiyonunu çağrıyoruz.
Şimdi geldik hata yakalama operatörlerine, veritabanı işlemi yaparken bazen Sqlitebrowser açık alıyordu. Veritabanıyla kesişen bir yazılım olduğunda veritabanı işlemleri de gerçeklemiyor, sqlite3.OperationalError: databaselocked hatasını alıyordum. Çözüm ise işte bu satırlar. except sqlite3.OperationalError: ifadesi ile hatayı yakalayıp dbH() fonksiyonunu çağırıyoruz. Her hataya ayrı bir fonksiyon üreterek hataya göre sistem yerine sizin verdiğiniz hata satırlar gözükür. Örnek olarak dBH() fonksiyonun içeriği aşağıdaki gibidir;
def dBH():
print
“Veritabanında kilitli, veritabanıyla etkileşimde olan
programları kapatın.”
Entry buraya
kadardı, umarım hazmedebilmişsizinizdir. Sabahın köründe yarı
baygın yazdım, belki bazı kötü betimlemiş olabilirim. Dediğim
gibi; varsa bir hatamız affola. Yüzeysel değinmeye çalıştım, fazla abartmadan.
Derinlemesine ve de bu yapı içerisinde else'i de kullanmak isterseniz; http://www.istihza.com/py2/hata.html adresindeki konuyu okumanızı tavsiye ederim.
Derinlemesine ve de bu yapı içerisinde else'i de kullanmak isterseniz; http://www.istihza.com/py2/hata.html adresindeki konuyu okumanızı tavsiye ederim.
0 yorum: