Bir cümlelik özet
Bir hata mesajı, Python'un "programın burada durdu, sebebi de bu" demesidir; onu okumayı öğrenince hata bir engel değil, bizi çözüme götüren bir ipucu olur.
Neden önemli?
Kod yazan herkes hata alır. Yeni başlayanlar da, yıllardır yazanlar da. Fark, hatayı görünce ne yaptıklarındadır. Bazı kişiler kırmızı yazıyı görünce panikleyip her yeri rastgele değiştirir. Diğerleri ise durup mesajı okur.
Python hata verdiğinde aslında sana yardım etmeye çalışır. Sana nerede durduğunu, hangi satırda takıldığını ve neyin ters gittiğini söyler. Bu bilgileri okumayı öğrenirsek, her hata küçük bir bulmacaya dönüşür. Bu derste hata mesajının parçalarını tanıyacak ve en sık karşılaşılan beş hata türünü örnekleriyle çözeceğiz.
Traceback: Python'un hata raporu
Bir program hata verip durduğunda Python ekrana bir rapor yazar. Bu rapora traceback denir. "Geriye izleme" diye düşünebilirsin: Python, hatanın çıktığı noktaya kadar hangi yoldan geldiğini geriye doğru anlatır.
Şu küçük programı çalıştırdığını düşün:
print(mesaj)
Python şuna benzer bir traceback yazar:
Traceback (most recent call last):
File "program.py", line 1, in <module>
print(mesaj)
NameError: name 'mesaj' is not defined
Bu kırmızı yazı korkutucu görünebilir, ama içinde sadece birkaç önemli parça var.
Bir traceback'in parçaları
Traceback (most recent call last):Bu satır sadece "işte hata raporu başlıyor" der.File "program.py", line 1Hatanın hangi dosyada ve hangi satırda fark edildiğini söyler. Burada 1. satır.print(mesaj)Python o satırdaki kodu sana geri gösterir, böylece nereye bakacağını bilirsin.NameError: name 'mesaj' is not definedEn önemli satır. İki parçadan oluşur: hata türü (NameError) ve açıklama (name 'mesaj' is not defined, yani "mesaj adında bir şey tanımlı değil").
Alttan yukarı okumak
Bir traceback'i okumanın en kolay yolu en alttan başlamaktır. Son satır sana neyin yanlış olduğunu söyler. Üstündeki File ... line ... satırı ise nereye bakman gerektiğini söyler.
Yani her traceback aslında iki soruyu yanıtlar:
- Ne oldu? → En alttaki hata türü ve açıklaması.
- Nerede oldu? →
linekelimesinin yanındaki satır numarası.
Bu iki bilgiyi bulunca işin yarısını bitirmiş olursun.
Not: Gösterilen traceback'ler Python 3'e aittir. Sürüme göre oklar veya küçük işaretler biraz farklı görünebilir; ama hata türü ve satır numarası aynı mantıkla okunur.
Beş yaygın hata türü
Yeni başlarken hataların çoğu birkaç türden gelir. Her birini bir örnek ve bir düzeltmeyle görelim.
SyntaxError — yazım hatası
SyntaxError, Python'un cümleyi anlayamaması demektir. Genelde eksik bir işaret vardır: iki nokta, tırnak veya parantez.
if 5 > 3
print("Beş üçten büyük")
File "program.py", line 1
if 5 > 3
^
SyntaxError: expected ':'
Python if satırının sonunda iki nokta bekliyordu ama bulamadı. Düzeltme, satırın sonuna : eklemektir:
if 5 > 3:
print("Beş üçten büyük")
NameError — tanımsız isim
NameError, kullandığın bir ismin daha önce tanımlanmadığı anlamına gelir. Çoğu zaman bir yazım yanlışı ya da unutulan bir atamadır.
puan = 10
print(pian)
Traceback (most recent call last):
File "program.py", line 2, in <module>
print(pian)
NameError: name 'pian' is not defined
Değişkenin adı puan, ama biz yanlışlıkla pian yazdık. Düzeltmesi kolay: ismi doğru yaz.
TypeError — uyumsuz türler
TypeError, birbirine uymayan türleri bir arada kullanmaya çalıştığında çıkar. En klasik örneği, bir metinle bir sayıyı + ile birleştirmeye çalışmaktır.
yas = 10
print("Yaşım " + yas)
Traceback (most recent call last):
File "program.py", line 2, in <module>
print("Yaşım " + yas)
TypeError: can only concatenate str (not "int") to str
Python metne ancak metin ekleyebilir. Sayıyı önce metne çevirmeliyiz:
yas = 10
print("Yaşım " + str(yas))
IndexError — listede olmayan sıra
IndexError, bir listede var olmayan bir konuma ulaşmaya çalıştığında çıkar. Listelerde sayma 0'dan başlar, bunu unutmak yaygın bir tuzaktır.
renkler = ["kırmızı", "yeşil", "mavi"]
print(renkler[3])
Traceback (most recent call last):
File "program.py", line 2, in <module>
print(renkler[3])
IndexError: list index out of range
Listenin 3 elemanı var ama sıraları 0, 1 ve 2. Son eleman renkler[2]'dir. Düzeltme, geçerli bir sıra kullanmaktır.
ValueError — yanlış değer
ValueError, tür doğru ama değerin kendisi uygun olmadığında çıkar. Sık görülen örnek, sayıya çevrilemeyen bir metni int() ile çevirmeye çalışmaktır.
sayi = int("merhaba")
Traceback (most recent call last):
File "program.py", line 1, in <module>
sayi = int("merhaba")
ValueError: invalid literal for int() with base 10: 'merhaba'
int() bir sayı bekliyordu, ama "merhaba" bir sayı değil. Kullanıcıdan sayı alırken bu hataya çok rastlanır; bu yüzden gelen değerin gerçekten sayı olduğundan emin olmak gerekir.
Hatayı korkmadan düzeltmek
Hata mesajını gördüğünde her şeyi silmene gerek yok. Küçük ve sakin bir yöntem işini görür.
Üç adımlı yaklaşım
- En alt satırı oku. Hata türü ve açıklaması neyin yanlış olduğunu söyler.
- Satır numarasına git.
File ... line 2diyorsa, kodunda 2. satıra bak. Hata genelde tam orada ya da hemen üstündedir. - Tek bir değişiklik yap ve yeniden çalıştır. Aynı anda birçok yeri değiştirme; birini düzelt, dene, sonucu gör.
Bir örnek üzerinden gidelim:
def selam_ver(isim):
print("Merhaba " + isim)
selam_ver()
Traceback (most recent call last):
File "program.py", line 4, in <module>
selam_ver()
TypeError: selam_ver() missing 1 required positional argument: 'isim'
Alt satır bir TypeError olduğunu ve isim argümanının eksik olduğunu söylüyor. Satır numarası 4'ü gösteriyor. Fonksiyonu çağırırken bir isim vermeyi unutmuşuz. Tek düzeltme yeter:
def selam_ver(isim):
print("Merhaba " + isim)
selam_ver("Ada")
Gördüğün gibi hata mesajı bize neredeyse doğrudan çözümü söyledi.
Mini uygulama
Aşağıdaki program bir sayının karesini yazdırmaya çalışıyor ama hata veriyor. Hatayı traceback'i okuyarak bul ve düzelt.
sayi = input("Bir sayı gir: ")
kare = sayi * sayi
print("Karesi:", kare)
- Programı çalıştır ve hangi hata türünü aldığını not et.
- Traceback'in alt satırını ve satır numarasını oku.
- Sorunun
input()fonksiyonunun metin döndürmesi olduğunu fark et. sayi = int(input("Bir sayı gir: "))yazarak metni sayıya çevir ve tekrar dene.
Çözümünü test etmek için farklı sayılar gir. Sonra harf gir ve nasıl bir ValueError aldığını gözlemle.
Sık yapılan hatalar
Mesajı okumadan değiştirmek
Kırmızı yazıyı görünce paniğe kapılıp rastgele kod değiştirmek çoğu zaman durumu kötüleştirir. Önce dur ve alt satırı oku.
Yanlış satıra bakmak
Bazen hata line 5 derken sorun gerçekte 4. satırda başlar. Belirtilen satırda bir şey göremiyorsan, hemen bir üstteki satıra da bak.
Hata türünü görmezden gelmek
NameError ile TypeError çok farklı sorunlardır. Türü okumadan düzeltmeye çalışmak zaman kaybettirir. Tür, hangi tür soruna baktığını söyler.
Listelerde 0'dan saymayı unutmak
Üç elemanlı bir listenin son sırası 2'dir, 3 değil. IndexError alırsan genelde sebebi budur.
Güvenlik notu
Hata çözerken internetten kopyaladığın kodu körü körüne çalıştırma. Sadece anladığın ve güvendiğin kendi kodunu çalıştır. Programlarında adını, adresini veya şifreni gibi kişisel bilgileri yazma; bunlar hatayla birlikte ekranda görünebilir. Emin olmadığında bir yetişkine sor.
Ders özeti
- Traceback, Python'un hata verdiğinde yazdığı rapordur ve okunmak için yazılmıştır.
- Bir traceback'i en alttan yukarı oku: son satır ne olduğunu,
linenumarası nerede olduğunu söyler. - Hata türü sorunun cinsini gösterir: SyntaxError, NameError, TypeError, IndexError, ValueError.
- Çoğu hatanın küçük ve tek bir sebebi vardır; tek değişiklik yapıp yeniden çalıştırmak en iyi yöntemdir.
- Hata yapmak başarısızlık değil, öğrenmenin normal bir parçasıdır.
Kontrol soruları
- Traceback nedir ve onu hangi yönde okumak en kolaydır?
- Bir traceback'in hangi bölümü sana hatanın nerede olduğunu söyler?
NameError: name 'pian' is not definedmesajının en olası sebebi nedir?"Yaşım " + 10nedenTypeErrorverir ve nasıl düzeltilir?- Üç elemanlı bir listede
liste[3]nedenIndexErrorverir?
Cevaplar
- Traceback, Python bir hatayla karşılaşıp durduğunda yazdığı rapordur. En alttan yukarı doğru okumak en kolayıdır; çünkü son satır neyin yanlış olduğunu söyler.
File "..." , line ...satırı hatanın hangi dosyada ve hangi satırda fark edildiğini söyler; yani nereye bakacağını gösterir.- Büyük olasılıkla bir yazım yanlışıdır. Değişkenin gerçek adı farklıdır (örneğin
puan) ve biz onu yanlış yazdık ya da tanımlamayı unuttuk. - Python bir metne ancak metin ekleyebilir, sayı ekleyemez. Sayıyı
str(10)ile metne çevirerek düzeltiriz. - Çünkü listelerde sıra 0'dan başlar. Üç elemanın sıraları 0, 1 ve 2'dir; 3 numaralı bir sıra yoktur, bu yüzden Python "list index out of range" der.
Kaynak ve doğrulama notu
“Hata Mesajlarını Okumak” dersi için doğrulama odağı Traceback: Python'un hata raporu ile Alttan yukarı okumak arasındaki ilişkinin örnekler üzerinde tutarlı çalışmasıdır. Kod örnekleri Python 3 sözdizimi esas alınarak hazırlanmıştır. Çalıştırma ortamına göre küçük farklar görülebileceği için örnekler önce güvenli bir çevrim içi editörde veya yerel geliştirme ortamında denenmelidir.
Sonraki ders
Dosyalarla Çalışmaya Giriş: Bilgiyi bir dosyaya yazmayı ve ondan geri okumayı öğrenerek programlarımızın hatırladıklarını kalıcı hale getiriyoruz.