Python Hata Yakalama Operatörü

18:57 Unknown 0 Comments


   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.
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ı;
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.  

   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;
sayi_int = 3
try:
    toplam = sayi_int + sayi_str
except (TypeError,NameError):
    pass
print toplam
şeklinde yapabiliriz. Eğer ayrı işlemler yapacaksak;
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;
sayi_int = 3
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()
    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.

0 yorum: