python dersleri

Python Hata Yakalama ve İstisnalar

Merhaba Arkadaşlar,

Mobilhanem.com da Python Dersleri serisinin bu dersin de Hata Yakalama ve İstisnalar  göreceğiz.

Öncelikle arkadaşlar Python Dersleri serisinde baya yol aldık. Artık basit de olsa uygulama geliştirebilecek seviyeye geldik. Python  da Yorum satırı dersini anlatırken kod yazmak kadar kodları okunabilir şekilde yazmanın da önemli olduğunu söylemiştik. Peki biz burada geliştiriciler için böyle bir sorunu ve çözümünü anlatırken son kullanıcılar için bir şey demeden mi geçeceğiz tabi ki hayır biz bu derste geliştiriciler yanı sıra son kullanıcılarında karşılaşabileceği hataları ve bu hatalara karşı çözüm yollarını da anlatmaya çalışacağız.

Hata Türleri

Biz yukarıda geliştiriciler ve son kullanıcıların karşılaşabileceği hatalardan bahsettik peki bu hata türleri nelerdir. Arkadaşlar genel olarak hataları üç farklı  şekilde sıralayabiliriz.

  1. Programcı Hatası(Error)
  2. Program Kusurları veya Mantık Hatası(Bug)
  3. İstisnalar(Exception)

Şimdi bu hataları teker teker ayrıntılı şekilde ele alalım .

Programcı Hatası(Error)

Bu hata programcı veya geliştiricilerden kaynaklanan bir hatadır.

Programcının syntax   yazılım yanlışı vb. yaptığı hatalardır bu hata giderilmeden program hiçbir şekil de çalışmaz. Bu tür hataların fark edilmesi  ve çözülmesi kolaydır.

Hemen basit bir örnekle gösterelim;

print "Python Dersleri"

File "C:/Users/Cahit/PycharmProjects/proje1/errors.py", line 1

print "Python Dersleri"

^

SyntaxError: Missing parentheses in call to 'print'. Did you mean print("Python Dersleri")

Gördüğünüz gibi bir syntax hatası verdi. Ayrıca doğru kullanımı da bize gösterdi.

Bu hata çözülmeden program hiçbir şekilde çalışmayacaktır.

Program Hatası veya Mantık Hatası(Bug)

Bu hata türünün fark edilmesi bir önceki hata türünü ne göre zordur. Sebebi ise program çalışır durumdadır herhangi bir hata vermez ama istediğimiz sonuçtan farklı bir sonuç veya çıktı veriyor olmasıdır.

Mesela biz dışarıdan bir dairenin yarıçapını alalım ve bu değere göre dairenin alanını hesaplayalım;

yari_cap = int(input("Yarıçapı Girin :"))
pi =3.14
alan = pi+(yari_cap**2)
print("Dairenin Yarıçapı :",alan) 

Yarıçapı Girin :5
Dairenin Yarıçapı : 28.14

Bu şekilde programımız hata vermeden çalıştı ama formül hatası olduğu için istediğimiz sonuçtan farklı bir hata sonuç verdi.Bu türden hataları fark etmek zordur.

 İstisnalar(Exception)

Bu tür hatalarda da program bazı istisnalar‘dan dolayı hata verir. Bu tür hatalarda da program hata düzeltilmeden çalışmaz. Örneğin dışarıdan iki sayıyı alıp birinci sayıyı ikinci sayıya bölüp sonucu ekran veren programı yazalım.

sayi1 = int(input("Birinci Sayı :"))
sayi2 = int(input("İkinci Sayı :"))

sonuc = sayi1/sayi2print("Sonuc :",sonuc)  

Birinci Sayı :8

İkinci Sayı :3

Sonuc : 2.6666666666666665

Program normal koşullar da istediğimiz sonucu hatasız bir şekilde verir. Ama bazı istisnalar da bu program hata verir. Örneğin;

Birinci Sayı :5

İkinci Sayı :0

Traceback (most recent call last):

File "C:/Users/Cahit/PycharmProjects/proje1/errors.py", line 4, in <module>

sonuc = sayi1/sayi2

ZeroDivisionError: division by zero

İkinci sayıyı sıfır girdiğimiz zaman hata verdi çünkü biz herhangi bir sayının sıfıra bölünmesi tanımsızdır.

Şimdi biz böyle bir hata verdiğinde nasıl bir işlem yapabiliriz mesela;

Şimdi işin püf noktasına değineceğiz burada aldığımız hata bir programı yazan veya geliştiren kişi olarak az çok anlaşılabilir. Ama son kullanıcı için bu hata anlaşılmaz bir hatadır.

İşte bizde bu bölümde son kullanıcın hatayı veya istisnaları anlaşılabilir bir şekilde göstermeyi göreceğiz.

İşte burada  try ve except kavramlarına değineceğim.

Try…  except…

Peki bu kavramlar nedir ve nasıl kullanılır gibi sorular kafanızda oluşmuştur.  Try … except birer bloktur. Peki bu bloklar ne işe yarar bu bloklar bir hatayla karşılaştığımız herhangi bir işlem yapmamızı sağlayan bloklar dır. En basiti bir hatayla karşılaştığımızda kullanıcıya geriye dönük bir mesaj vermektir

Try:

Hata ile karşılaşabileceğimiz yerleri blok içine aldığımız kısım

Except:

Hataya göre göre yapılacak işlemler.

sayi1 = int(input("Birinci Sayı :"))
sayi2 = int(input("İkinci Sayı :"))

try:
  sonuc = sayi1/sayi2
  print("Sonuc :",sonuc)

except ZeroDivisionError:
  print("Bir sayıyı sıfıra bölemezsiniz lütfen sıfır dışında bir sayı girin")


Birinci Sayı :5

İkinci Sayı :0

Bir sayıyı sıfıra bölemezsiniz lütfen sıfır dışında bir sayı girin

Bu şekilde bir hata ile karşılaştığımız da kullanıcıya bir mesaj verdik peki sadece bir istisnaya karşı mı önlem alabiliyor muyuz diye kafanıza takılmıştır.

Yani şu şekilde kullanıcı sayı dışında bir karakter girerse o zaman ne olacak bu seferde şu şekilde bir istisna ile karşılaşacağız;

Birinci Sayı :8

İkinci Sayı :d

Traceback (most recent call last):

File "C:/Users/Cahit/PycharmProjects/proje1/errors.py", line 2, in <module>

sayi2 = int(input("İkinci Syı :"))

ValueError: invalid literal for int() with base 10: 'd'

Yani veri türü hatası aldık.

Tabi ki hayır istediğiniz kadar hataya karşı önlem alabilirsiniz.

try:
    sayi1 = int(input("Birinci Sayı :"))
    sayi2 = int(input("İkinci Syı :"))
    sonuc = sayi1/sayi2
    print("Sonuc :",sonuc)

except (ZeroDivisionError,ValueError) :
    print("Lütfen girdiğiniz değerlere dikkat edin")

Bu şekilde birden fazla hataya karşı nasıl önlem alabileceğimizi öğrenmiş olduk. Ama burada hala bir eksiklik var nasıl yani derseniz şimdi biz iki hatayı aynı blok içine yazdığımız için  burada bir belirsizlik var kullanıcı acaba hangi hatayı yaptım derdine düşecektir. Bu yüzden hatları ayrı bloklar içine almamız doğru olacaktır.

try:
    sayi1 = int(input("Birinci Sayı :"))
    sayi2 = int(input("İkinci Syı :"))
    sonuc = sayi1/sayi2
    print("Sonuc :",sonuc)

except ZeroDivisionError:
    print("Lütfen ikinci sayıya sıfırdan farklı bir değer girin…")

except: ValueError:

    print(“Lütfen sayısal bir karakter girin..)

Şimdi kafanıza bir soru daha gelmiştir. Bütün hataları yani istisnaları nereden bileceğiz yani hepsini tekrar girmek zorunda mıyız.  Tabi ki hayır. Eğer siz except bloğuna hatayı yazmazsanız yorumlayıcı yazılan hata türleri dışında bütün hataları kapsayacaktır if else deki else ifadesi gibi 🙂

try:

    sayi1 = int(input("Birinci Sayı :"))
    sayi2 = int(input("İkinci Syı :"))
    sonuc = sayi1/sayi2 print("Sonuc :",sonuc)

except ZeroDivisionError:
    print("Lütfen ikinci sayıya sıfırdan farklı bir değer girin…")

except: ValueError: 
    print(“Lütfen sayısal bir karakter girin..)

except:
    print("Beklenmeyen bir hata oluştu")

Bu şekilde bunu da öğrenmiş olduk bitti peki tabi ki hayır 🙂 Şimdi biz hata ile karşılaştığımızda hatayı mesaj olarak verdik ama hatanın birde  açıklaması var. Yani nasıl bir hata yapılmış ve bu hatanın nasıl çözüleceğini de bize  veriyor. Bir önceki örnekler şu şekilde bir hata vardı;

SyntaxError: Missing parentheses in call to ‘print’. Did you mean print(“Python Dersleri”)

Missing parentheses in call to ‘print’. Did you mean print(“Python Dersleri”) kısmı hatanın açıklamasıdır. Biz dilersek bunu da mesaj olarak verebiliriz. Nasıl mı ? Hemen bir örnekle göstereyim;

try:

    sayi1 = int(input("Birinci Sayı :"))
    sayi2 = int(input("İkinci Sayı :"))
    sonuc = sayi1/sayi2
    print("Sonuc :",sonuc)

except ZeroDivisionError  as acıklama:
    print(acıklama)
Birinci Sayı :6
İkinci Sayı :0
division by zero

Gördüğünüz gibi hata açıklamasını bize mesaj olarak verdi. Program herhangi bir hata bize göstermedi çünkü biz bu hatayla karşılaşırsak bunu yap dedik. Yani hatanın açıklamasını mesaj olarak ver.

try… except… finally

Biz hata ile karşılaştığımızda bazı işlemler yaptırdık. Ama bazen öyle işlemler oluyor ki hata olsa da olmasa da  mutlaka yapılması gereken işlemler. Örneğin  bir dosyayı açıp üzerinde herhangi bir işlem yaptıktan sonra mutlaka dosyayı kapatmamız lazım. İşte burada finally bloğunu kullanıyoruz.

try:
   dosya = open("deneme.txt", "r")
except IOError:
   print("bir hata oluştu!")
finally:
   dosya.close()

Raise:

Bazen biz kendimiz hata herhangi bir hatayı sistem hatası gibi gösterebiliriz. Örneğin bir dairenin alanını hesaplayan bir uygulama yapalım burada dikkat etmemiz gerek şey; yarıçap sıfır ve sıfırdan küçük bir değer olamaz. Hemen uygulamayı yapalım;

yari_cap = int(input("Yarıçapı girin :"))
pi=3.14
if yari_cap <= 0:
    raise ValueError("Yarıçap sıfır ve sıfırdan küçük bir değer olamaz")

sonuc =pi*(yari_cap**2)
print("Yarıçap :{}'dir".format(sonuc))

Eğer sıfır veya sıfırdan küçük bir değer girersek şu şekilde bir çıktı alırız:

ValueError: Yarıçap sıfır ve sıfırdan küçük bir değer olamaz

Bir Python dersinin daha sonuna geldik.  Sizden isteğim sadece okuma ile kalmayın farklı uygulamalar yapmanız. Uyulamalar için buraya bakabilirsiniz.

Mobilhanem.com da Python da Hata Türleri ve İstisnalar dersinin sonuna geldik. Bir sonraki derste Python da Dosya işlemlerini anlatacağım. Bir sonraki derste görüşmek üzere 🙂

Tüm Python Eğitimleri

189

Cahit İşleyen

Data Scientist at @Embedica.ai
Python ve Linux sever.
Çay tiryakisi

3 Yorum

  • Merhaba hocam mesela yari_cap = int(input(“Yarıçapı girin :”)) bu komutu yazınca sonraki satırda yarıçapı girin: şeklinde komut çıkıyor ve bu yüzden inputlu hiçbirşey yazamıyorum eğer kafamdan sayı yazıp devamını getirdiğimde tek onu yapıyor ve sonra sıfırlanıyor tekrarlıyorum tüm komutları yazmayı neden böyle oluyor ?

  • ari_cap = int(input(“yarı çapı girin:”))
    pi = 3.14
    if yari_cap <= 0:
    raise ValueError(“yarı çap sıfır ve sıfırdan küçük olamaz”)

    sonuc = pi*(yari_cap**2)
    print((“yarı çap:{}’dir”.format(sonuc)))

    YAZDIĞIMIZDA

    if yari_cap <= 0:
    ^
    SyntaxError: invalid syntax
    HATASI ALIYORUM, YARDIMCI OLABİLİR MİSİNİZ

Haftalık Bülten

Mobilhanem'de yayınlanan dersleri haftalık mail almak ister misiniz?