Programcılıkta ne kadar hatasız kod yazarsanız yazın, kodlarınız ne kadar işlevsel olursa olsun, dokümantasyonunuz ne kadar detaylı olursa olsun yinede iş son kullanıcıya geldiğinde bir takım hatalar yapılması muhtemeldir.
Şöyle ki "maymun kullanıcı" olarak tabir edilen kullanıcılar hep olacaktır ve programlarınızda yapılmaması gereken bazı şeyleri muhtemeldir ki yapacaktır. Bu durumlarda program beklenmedik istekler karşısında çökecektir. Bir programın çökmesi, onu yazan programcı için en kötü durumlardan biridir. Şayet çöken programlar asla güven vermez ve sizlerin de iyi birer programcı olmasının önünde en büyük engellerden biri olur.
İşte burada programcı detaylı düşünerek kullanıcının yapabileceği hataları önceden kestirebilmesi ve bunun için önlemler alması gerekir. İşte biz burada, bu hataları nasıl yakalayacağımızı öğreneceğiz.
Hatırlarsanız kullanıcıdan veri alırken input() fonksiyonu, aldığımız veriyi string türünde alıyordu. Eğer bizler alınan veri ile matematiksel işlemler yapmak istiyorsak bunu integer türüne çevirmemiz gerekiyordu.
>>> dtarih = int(input("Doğum Yılınız: "))
>>> print("2018 yılında {} yaşındaydınız".format(2018-dtarih))
Burada kullanıcı doğum tarihini sayı olarak girdiği sürece sıkıntı yok, ama yukarıda da belirttiğimiz gibi maymun kullanıcılar tarihi yazıyla girmeye çalışırsa (yadan yanlışlıkla bir harf girerlerse) program çökecektir şayet harfler sayıya çevrilemezler! İşte bu ve benzeri durumlarda hata yakalamamız gerekiyor.
Yukarıda doğum tarihini yerine string türünde bir veri giren kullanıcının karşılaştığı hatayı gösteriyor. Hata okumanın önemini taa ilk derslerde bahsetmiştik hatırlarsanız. Burada bize "ValueError" türünde bir hata döndü. Bu bize hatanın tipini söylüyor (ki hataları bu türlere göre yakalayacağız). Ayrıca hatanın sebebini ve hataya sevep olan kısmı da söylüyor. int() fonksiyonunun bir harfi sayıya çeviremeyeceğini söylüyor.
Hadi hata yakalayayım! Hata yakalarken Python dilinde try/except yapısın kullanılır. try bloğu içerisine çalışmasını istediğimiz kodları, except bloğunun içine ise try bloğunun içinde ki kodlar hata verdiği zaman çalışmasını istediğimiz kodları ekliyoruz.
try:
dtarih = int(input("Doğum Yılınız: "))
print("2018 yılında {} yaşındaydınız".format(2018-dtarih))
except:
print("Sadece tam sayı girebilirsiniz!")
Bu kodu çalıştırırsanız ve sayı yerine harf girerseniz kodunuzun çökmeden uyarı verip kapandığını görebilirsiniz. Bu <son kullanıcı için> anlamsız hata mesajlarından daha anlaşılır ve güzel bir uyarı biçimi oldu. Eğer isterseniz hatanın türüne göre özel uyarı mesajları verdirebilirsiniz.
Misal yukarıda gördük ki bize ValueError diyerek hata türü dönderdi. Eğer biz bir sayıyı 0 a bölmeye çalışsaydık bize ZeroDivisionError diyerek hata dönecekti. Hatanın türüne özel uyarı verdirmek istiyorsanız except dedikten sonra hata türünü yazmanız gerekir.
try:
dtarih = int(input("Doğum Yılınız: "))
print("2018 yılında {} yaşındaydınız".format(2018-dtarih))
except ValueError:
print("Sadece tam sayı girebilirsiniz!")
Yine yukarıda ki kodda eğer ValueError tip dışında bir hata verirse program uyarı vermeyecek, çökecektir.
Devamı gelecek.
Finally Bloğu
Bazı durumlarda yazdığımız program çökse de çökmese de yapılması gereken bazı işlemler vardır. Örneğin bir döngü ile veri tabanına kayıt yaparken program işlemin ortasında çökerse, veritabanının kapatılması gerekir. Yok çökmez, işlemi tamamlarsa yine de veritabanının kapatılması gerekir. İşte hata yakalama işlemlerinde ki Finally bloğu, program çökse de çökmese de yapılacak işlemleri söyler.
db = db.baglan()
try:
db.islem("INSERT INTO kisi (isim, yas) VALUES ('emre', '21')")
except:
print("Bir Hata Oluştu!")
finally:
db.kapat()
Yukarıda ki örnekte hayali bir fonksiyon ile hayali bir veri tabanı işlemi gerçekleştirilmiştir. Kodun yapısını incelemek daha mantıklı olacaktır burada.
Try bloğu içerisinde asıl yapılacak işlem belirlenmiştir. Except ile hata durumunda gösterilecek mesajı belirttik. Finally ile ise olası bütün durumlarda yapılacak işlemi belirttik. Yani olası her durumda veri tabanı kapatılacaktır.