Hata Yakalama

Gökhan YAVAŞ
gokhanyavas
Published in
3 min readDec 10, 2016

Şimdiye kadar göstermiş olduğum örneklerde dikkat ettiyseniz hep nasıl kullanılmasını istiyorsak o şekilde programladık. Örneğin sayılar üzerinde işlem yapan programı ele alalım. Bu programı kodlarken muhtemelen kullanıcı sayı girip işlem yapar diye düşündük ya kullanıcı harf girseydi ne olurdu hiç düşündünüz mü? İşte bu gibi durumların önüne geçmek için bu bölümde hata türlerini inceleyip yazdığımız programların hata yapma riskini azaltacağız.

Hata Türleri

Hataları 3 farklı bölümde inceleyeceğiz.

  1. Geliştirici Hataları (Error)
  2. Uygulama Kusurları (Bug)
  3. İstisnalar (Exception)

Geliştirici Hatalarından başlayalım. Geliştiriciden kaynaklanan hatalar, programı yazan kişinin yapmış olduğu hatalardır.

Uygulama Kusurları, bir başka deyişle bug’lar çoğu zaman hata vermeden sinsice çalışır. Örneğin formüllerin yanlış yazılması…

İstisnalar, adından da anlayabileceğiniz üzere uygulamamız çalışırken aniden ortaya çıkan durumlardır. Konuya örnek olarak konunun başındaki sorduğum soru verilebilir.

Konuyla ilgili ön bilgi verdiğimize göre detayları öğrenmeye başlayabiliriz.

try… except…

Python’da hataları yakalamak için try… except… bloklarından yararlanırız.

try:
sayı1 = int(input("Birinci Sayiyi Girin :"))
sayı2 = int(input("Ikinci Sayiyi Girin :"))
print(sayı1, "/", sayı2, "=", sayı1 / sayı2)
except ValueError:
print("Lütfen sadece sayı girin!")
Cikti :
Birinci Sayiyi Girin :f
Lütfen sadece sayı girin!
Bu kod, program çalışırken bir ValueError ile karşılaşırsan görmezden gel, normal şartlarda göstereceğin hata mesajını gösterme onun yerine kullanıcıya Lütfen sadece sayı girin! uyarısını göster dedik. Temel olarak yapımız aşağıdaki biçimde.
try:
hataya sebep olabilecek kodlar
except HataAdı:
hata durumunda yapılacaklar
Matematiksel işlemler yapıyorsak HataAdı kısmında ZeroDivisionError deyimini kullanırsak, kullanıcı sayıyı sıfıra bölmek istediğinde programımızın hata vermesinin önüne geçip uyarı verebiliriz.

try… except… as…

try... except... as... tıpkı try.. except.. kullanımı gibidir. Aradaki farkı sadece programlarımızda verilen hata mesajını ekrana detaylı bir biçimde yazdırmak için kullanılan as deyimidir. Biraz önceki örnek üzerinden gidelim:try:
sayı1 = int(input("Birinci Sayiyi Girin :"))
sayı2 = int(input("Ikinci Sayiyi Girin :"))
print(sayı1, "/", sayı2, "=", sayı1 / sayı2)
except ValueError as hata:
print(hata)
Cıktı:
Birinci Sayiyi Girin :f
invalid literal for int() with base 10: 'f'
Gördüğünüz gibi bu sefer bize hatamızı yazdı. Bu yapı ile hem bizim belirtiğimiz hata mesajını ve orjinal hata mesajını gösterebiliriz. Ayrıca hata mesajlarını gruplayabiliriz.try
.
.
.
except (ValueError, ZeroDivisionError) as hata:
print("Bir hata oluştu!")
print("orijinal hata mesajı: ", hata)

try… except… else…

Python'da hata yakalamak için yukarıdaki öğrendiğimiz modeller işimizi görür ancak python bize her zaman işimize yarayacak başka araçlarda sunmaktadır. Bu yapıda onlardan birisidir. Else deyimini koşullu ifadelerde görmüştük. Buradaki kullanımıda aynıdır. Bu yapıda else blogunda hataların nasıl gruplandığını örnekle kavrayalım:try:
bölünen = int(input("bölünecek sayı: "))
bölen = int(input("bölen sayı: "))
except ValueError:
print("Lütfen sadece sayı girin!")
else:
try:
print(bölünen/bölen)
except ZeroDivisionError:
print("Bir sayıyı 0'a bölemezsiniz!")
Cıktı :bölünecek sayı: 5
bölen sayı: 0
Bir sayıyı 0'a bölemezsiniz!
ilk try blogunda kullanıcının sayı girip girmediğini kontrol ediyor, ikincisinde ise else deyimiyle sayının 0 a bölünmesi durumunda hatayı yakalayıp ekrana yazdırıyoruz.

try… except… finally…

Bu yapının kullanımı şu şekildedir:try:
bir takım işler
except birHata:
hata alınınca yapılacak işlemler
finally:
hata olsa da olmasa da yapılması gerekenler işlemler
Yazdığınız programlarda mutluka işletilmesi gereken yapılar varsa o kısmı finally bloğu içersinde yazabiliriz.

raise

Python'a özgü hata göstermeye yarayan deyimdir. Bu deyimle duruma özgü hata mesajı üretebiliriz.tr_karakter = "şçğüöıİ"
parola = input("Parolanız: ")
for i in parola:
if i in tr_karakter:
raise TypeError("Parolada Türkçe karakter kullanılamaz!")
else:
pass
print("Parola kabul edildi!")
Cıktı :Parolanız: ıstanbul
Traceback (most recent call last):
File "/Users/gokhanyavas/PycharmProjects/Ilk_Projemiz/math.py", line 5, in <module>
raise TypeError("Parolada Türkçe karakter kullanılamaz!")
TypeError: Parolada Türkçe karakter kullanılamaz!
örneği incelediyseniz raise deyimini çok iyi anladığınızı düşünüyorum. Yapmış olduğumuz uygulamalarda tüm hataları yakalamak istersek sade bir şekilde try.. except... yapısını kullanmamız uygun olacaktır.

--

--