1E: Hatalar

Ne kadar çok program yazarsanız hatalarla (error ve bug) karşılaşma ihtimaliniz o kadar artar. Hatanın sebebini bulmak ve anlamak, sonra da hataları tamir etmek program yazmanın önemli bir parçasıdır. Python, sizin ondan yapmanızı istediğiniz her işlemi gerçekleştirmek için elinden geleni yapacaktır, ama ne demek istediğinizi anlayamazsa programı çalıştıramaz. Yine de Python, sizin hatayı bulup düzeltebilmeniz için neyin yanlış gittiğine dair bilgi verir.

İşte iki Python hatası.

Example: Bir Syntax Hatası

Bu ilk örnekte print(...). komutunun gerektirdiği parantezleri koymayı unuttuk ve Python ne yapması gerektiğini bilmiyor.

İkinci hata da Python'da bir bug örneği.

Example: Bir Run-Time Hatası

İkinci örneğimizde ise greeting değişkenine içerik tanımlayı unuttuk. Python ne istediğinizi anlıyor, ama greeting değişkenini baştan tanımlanmamış olduğu için hata ortaya çıkıyor.

Python sizin ne dediğinizi anlamadığında bir syntax error oluşur. Bir run-time error ise Python ne dediğinizi anladığı ama verdiğiniz yönergeyi nasıl uygulayacağını bilmediğinde oluşur.

Türkçeyi ele aldığımızda syntax error şöyle olabilir:

Lütfen kedi köpek maymun.

Bu cümlenin grameri anlamsız. Türkçe gramerine göre burada eksik olan fiildir (yüklem). Sizden ne istendiğini anlamanız mümkün değil. Syntax "sözdizimi" aynı gramer gibidir.

Türkçede run-time error ise şöyle olurdu:

Lütfen piyanoyu ye.

Cümlede gramatik olarak bir sorun yok; özne, yüklem yerli yerinde, bizden ne istenmekte olduğunu anlıyoruz. Ama komutu uygulayıp piyanoyu yemeye kalktığımızda bazı sorunlarla karşılaşabiliriz (tabii termit değilsek). Bu da run-time error olarak adlandırılır, çünkü sorunla işlem başladıktan sonra karşılaşılır.

Bunlara ek olarak logic errors "mantık hataları" hakkında da biraz konuşalım. Bu hatalarda program çökmeden çalışır ama beklediğimizin dışında bir sonuç ortaya çıkar. Buna örnek bir cümle:

Lütfen arka kapıyı kapat, içeri böcek girmesin.

Eğer ön kapı da açıksa bu cümlede bir mantık hatası vardır: Komut tek başına mantıklı da görünse; ön kapı açıkken arka kapayı kapatmakla eve böcek girişi engellenemeyeceğinden, bu komut gerçekleşmesi istenen sonucu üretmekten uzaktır; arka kapıyı kapatmak böcek girişini engellemeye yetmez.

Python'da Genel Syntax Hataları

Python'da karşımıza çıkabilecek başka bazı syntax hataları da vardır. Çok genel bir hata Python'da beklenmedik bir yerde beklenmedik bir işaretin bulunması ile oluşur.

Example: Syntax Hatası

Python buna SyntaxError: invalid syntax cevabını verir ve  ^  işaretiyle hatanın yerini gösterir. Problem şu ki ! ünlem işaretinin Python için bir anlamı yoktur. Bu syntax hatası, komutu print("Selam, Dünya!") şeklinde yazdığımızda düzelir, çünkü böylece Python ünlemin !  yazdırmak istediğimiz metnin bir parçası olduğunu anlar Selam, Dünya.

Daha incelikli başka bir syntax hatasına bakalım.

Example: Syntax Hatası

Burada değişken olarak seçilen class kelimesi Python için özel bir terimdir. Class yerine örneğin course dediğimizde hata düzelecektir. Buraya tıklayarak Python'daki tüm özel "anahtar kelimeler" listesini görebilirsiniz.

Tırnak veya parantez işaretlerini kullanırken bunları kapatmayı unutursanız syntax hataları ile karşılaşırsınız:

Example: Syntax Hatası
İkinci tırnak unutuldu

Bu hatada, EOL İngilizce "satırın sonu" ifadesinin ilk harflerinden oluşur, End Of Line: Python açılan tırnağın ikinci bir "  işareti ile kapanması bekler, ama satırın sonunda olması gereken bu işaret bulunamamıştır.

Example: Syntax Hatası
İkinci parantez unutuldu

Benzer olarak, EOF İngilizce "dosyanın sonu" ifadesinin ilk harfleridir, End Of File: Python parantezi kapatacak ) işaretini arar, ama program dosyası bu işaret olmaksızın sona ermiştir.

Bazen birbirine çok benzeyen iki syntax hatası çok farklı iki hata mesajı verebilir. Fakat her hata mesajı bize hatayı düzeltmemiz için yardımcı olacak bilgi vermektedir.

Run-Time Hataları

Burada yaygın run-time hatalarından birkaç tanesine bakalım. Python programı anlayabilir ancak yönergeleri yerine getirirken bazı sorunlarla karşılaşabilir.

  • daha önce tanımlanmamış bir değişken veya fonksiyonu kullanmak. Bu hata örneğin değişken ismindeki büyük harflerin tutarsız yazımından da doğabilir: 
    Example
    Tanımlanmamış değişken
  • sıfıra bölmek, ki matematiksel olarak da anlamsızdır. (Neden? Herhangi bir sayının 0 ile çarpımı 0 olduğuna göre  1 = X * 0 işleminin bir çözümü yoktur,yani 1/0 tanımlanmamıştır.)
    Example
    Sıfıra bölmek
  • veri tiplerini yanlış işleme tâbi tutmak
    Example
    Metin ve sayıyla toplama işlemi

Python hakkında daha çok bilgi edindikçe daha fazla hata yapma yolu öğreneceksiniz.

Syntax ve run-time hataları arasındaki teknik fark nedir? Run-time hatası ile syntax hatasını karşılaştırmak için bir örnekten faydalanabiliriz. Her programın çıktısına (output) göz atın.
Example: Run-Time Hatası
Example: Syntax Hatası
Run-time hatası olan program bir çıktı verdi, ama syntax hatası olan program herhangi bir çıktı vermedi. Çünkü Python iki adımda çalışır:

  1. Python önce programınızın sözdiziminin (syntax) doğru olup olmadığını görmek için yapısını ve bileşenlerini kontrol eder.
  2. Eğer ilk adımda syntax hatası ile karşılaşılmazsa program işleme konur.

Yani, syntax hatası olan bir program hiçbir şekilde işleme konmaz, ama run-time hatası ile programın hatayla karşılaştığı noktaya kadar ilerlenebilir.

Mantık Hataları

Programınız çökmeksizin çalışabilir (syntax veya run-time hataları olmaksızın), ama yine de bir hata bulunur. Örneğin, x ve y değişkenleri ile tanımladığınız iki rakamın ortalamasınız almak istersiniz,

\displaystyle{\frac{x+y}{2}}

Ama program neden çalışmıyor?

Example
Ortalamayı doğru hesalamıyor.

Ortalama

\displaystyle{\frac{x+y}{2}=\frac{3+4}{2}=\frac{7}{2}=3.5}

olmalıydı ama program 5.0 sonucunu veriyor! Bu kez hata aritmetikteki "işlemlerin öncelik sıralaması" ile ilgili.  x + y / 2, yazdığınızda söylediğiniz şey, y'nin 2'ye bölünmesidir: x + (y / 2) = 3 + (4 / 2) = 3 + 2 = 5. Sorunu çözmek için üçüncü satır ortalama = (x + y) / 2, şeklinde yazılmalıydı ki Python \frac{x+y}{2}, işlemini öncelikle toplama sonra bölme sıralaması ile yapabilsin.

Mantık hataları programı yanlış kurgulamanızdan, yanlış dizayn etmenizden kaynaklanır. Veya kurgunuzu yazdığınız koda yanlış yansıtmış olabilirsiniz (ortalama örneğindeki gibi). Mantık hatalarını tespit etmek zor olabilir, özellikle uzun programlarda. Ama kod yazmakta kendinizi geliştirdikçe mantık hatalardan kaçınmakta daha becerikli olacaksınız. 6D  dersinde mantık hatalarından kaçınmak konusunda birkaç ipucu bulabileceksiniz.

Alıştırmalar

Bu dersi bitirirken alıştırmada verilen 3 programdaki hataları düzeltelim, buna debugging (programlardaki hataları gidermek) denir. Programları çalıştırmadan önce hataları bulmaya, veya önce çalıştırıp Python'un işaret ettiği hatayı düzeltmeye çalışabilirsiniz.

Her programda önceden yazılmış kodları bulacaksınız. Hataları düzeltmek için sadece birkaç karakter (harf/sembol/rakam) değiştirmeniz yetecek. Belirtilenden fazla karakter değiştirmeniz hâlinde, Düzenleyici çözümünüzü reddeder. Orijinal versiyona dönmek için Varsayılan koda dön seçebilirsiniz.

Coding Exercise: Toplar
Aşağıdaki programda bulunan syntax hatasını giderin ve 1'den 10'a kadar sayıları toplayıp sonucu yazsın. En fazla bir karakter değiştirebilirsiniz.

Coding Exercise: Selam Hasan
Aşağıdaki programda bulunan run-time hatasını düzeltin, ilk satırda Selam ikinci satırda Hasan yazsın. En fazla 2 karakter değiştirebilirsiniz.

Coding Exercise: Alışveriş
Et ve süt almaya gideceksiniz ama KDV'si var. 4 liralık süt, 8 liralık et alıyorsunuz ve vergi de %3. Alışverişinizin toplam tutarını yazdırın (print). (Para birimini yazdırmanıza gerek yok.) İpucu

Tüm bugları yok ettiyseniz, bir sonraki derse geçebiliriz!