Menu
Playground'da Dene

Python Hata Tipleri ve Hata Ayıklama: Traceback Okuma ve Yaygın Hataları Düzeltme

En sık karşılaşacağın Python hatalarının turu — KeyError, ValueError, ModuleNotFoundError, EOFError — ve onları hızlıca düzelten hata ayıklama alışkanlıkları.

Hatalar, Python'un Sana Ne Olduğunu Anlatma Biçimidir

Her Python hatası bir tipi, mesajı ve traceback'i — oraya götüren çağrı zinciri — olan bir nesnedir. Birini iyi okumak edinebileceğin en büyük tek hata ayıklama becerisidir. Bu sayfa gerçekten karşılaşacağın hataların ve onları düzeltmeyi hızlandıran alışkanlıkların turudur.

try/except'in mekaniği ve kendi hatalarını fırlatmak için daha derin bir bakış istiyorsan, İstisnalar sayfası söz dizimini işliyor. Bu sayfa ise belirli hatalar ve onları nasıl okuyacağın üzerine.

Bir Traceback'i Okumak

Bozulan bir şey çalıştır:

def divide(a, b):
    return a / b

def report(values):
    for v in values:
        print(divide(10, v))

report([5, 2, 0])

Python şuna benzer bir şey yazdırır:

Traceback (most recent call last):
  File "script.py", line 8, in <module>
    report([5, 2, 0])
  File "script.py", line 6, in report
    print(divide(10, v))
  File "script.py", line 2, in divide
    return a / b
ZeroDivisionError: division by zero

Bunu aşağıdan yukarı oku:

  1. ZeroDivisionError: division by zero — istisna tipi ve mesajı. Bu, neyin yanlış gittiğidir.
  2. divide, 2. satırdaki return a / b — gerçekten fırlatan satır.
  3. report, 6. satırdaki print(divide(10, v)) — onu tetikleyen çağrı.
  4. Modül düzeyinde, 8. satırdaki report([5, 2, 0]) — nereden başladı.

En alttaki frame neredeyse her zaman düzeltmenin gideceği yerdir. Bir kütüphane kendi derinliklerinde bir hata fırlattığında, traceback'te yukarı yürüyerek senin kodundaki ilk frame'e gel — kötü girdiyi geçirdiğin çağrı orasıdır.

En Sık Karşılaşacağın Hatalar

NameError

main.py
Output
Click Run to see the output here.

"Name 'mesage' is not defined." Yazım hataları ya da bir değişkeni atanmadan kullanmaktan kaynaklanır. Python'un hata mesajı son sürümlerde genelde olası bir değişikliği önerir ("Did you mean 'message'?").

Düzeltme: yazımı ve kapsamı kontrol et. İsim yalnızca bir fonksiyon içinde varsa, onu dışarıdan okuyamazsın.

TypeError

main.py
Output
Click Run to see the output here.

"Can only concatenate str (not 'int') to str." İşlem için yanlış tip. Klasikler: bir string'i bir sayıya eklemek, çağrılabilir olmayan bir şeyi çağırmak, bir fonksiyona yanlış sayıda argüman geçirmek.

Düzeltme: tipleri açıkça dönüştür (str(30), int("30")) ya da gerçekten neyi geçirdiğine bak. Tipler arası f-string genellikle + birleştirmesinden daha iyi okunur: f"age: {30}".

ValueError

main.py
Output
Click Run to see the output here.

"Invalid literal for int() with base 10: 'hello'." Tip doğru — int(), string kabul eder — ama değer uymuyor. int(), float(), datetime ayrıştırma ve sınırlı bir argüman alan fonksiyonlarda yaygındır.

Düzeltme: dönüştürmeden önce doğrula veya hatayı yakalayıp ele al:

main.py
Output
Click Run to see the output here.

KeyError

main.py
Output
Click Run to see the output here.

"KeyError: 'charlie'." Anahtar dict'te yok. Niyetine göre seçilmiş üç deyimsel çözüm:

main.py
Output
Click Run to see the output here.

Eksik anahtarların otomatik başlatılması gereken bir dict için collections.defaultdict'e bakmaya değer.

IndexError

main.py
Output
Click Run to see the output here.

"List index out of range." Dizinin sahip olmadığı bir konumu istedin.

Düzeltme: uzunluk kontrolüyle koru, son öğeye başvurmak için -1 kullan ya da dilimleme kullan (numbers[5:6] fırlatmak yerine [] döner).

AttributeError

main.py
Output
Click Run to see the output here.

"'NoneType' object has no attribute 'upper'." Bir metodu, ona sahip olmayan bir şey üzerinde çağırdın. Neredeyse her zaman bir değişkenin beklenmeyen bir tipte olduğu anlamına gelir — genelde gerçek bir değer beklerken None olur.

Düzeltme: None'ın nereden geldiğini bul. print(type(var)) ya da hatanın hemen öncesine bir breakpoint en hızlı yoldur. "Bazen başarısız olan" fonksiyonlar genellikle None döner; üstlerinde metot çağırmadan önce dönüş değerini kontrol et.

ModuleNotFoundError (ve ImportError)

import fastapi

"No module named 'fastapi'." Paket, script'inin kullandığı Python yorumlayıcısına kurulu değil. İki yaygın sebep:

  1. Gerçekten kurmamışsın. Doğru ortamda python -m pip install fastapi çalıştır.
  2. Kurdun ama farklı bir Python'a. macOS'ta pip ve python farklı kurulumlara işaret ettiğinde sürekli olur.

Güvenilir çözüm, çalıştırdığın yorumlayıcıyla aynıyla kurmaktır:

python -m pip install fastapi

Bir sanal ortam kullanıyorsan (kullanmalısın), hem pip install hem de python script.py'den önce aktif olduğundan emin ol.

FileNotFoundError

with open("settings.yaml") as f:
    config = f.read()

"[Errno 2] No such file or directory: 'settings.yaml'." Yol, script'in çalıştığı yere göre mevcut değil.

Düzeltme: Python'un nerede baktığını doğrulamak için script'in başında os.getcwd() yazdır. Yolları script'in kendi konumuna sabitlemek için mutlak yollar veya pathlib.Path(__file__).parent / "settings.yaml" kullan.

EOFError

name = input("Name: ")

"EOF when reading a line." input(), stdin'den okumaya çalıştı ve bir şey almadı — girdi boş bir kaynaktan pipe edildi ya da prompt'ta Ctrl-D'ye bastın.

Düzeltme: pipe yapmak meşru ise çağrıyı sar:

try:
    name = input("Name: ")
except EOFError:
    name = "anonymous"

Bu docs'un tarayıcı editöründe runtime girdiyi simüle eder; orada bununla karşılaşmazsın.

IndentationError ve SyntaxError

IndentationError: expected an indented block after function definition on line 2

Bunlar özeldir — programın çalışmadan önce fırlarlar. Python dosyayı ayrıştırmayı reddetti.

  • IndentationError — bir def, if, for vb. gövdesi eksik ya da hizasız. Çoğu editör girintiyi görselleştirir; karışık tab ve boşlukları yakalamak için "boşluğu göster"i aç.
  • SyntaxError — iki nokta üst üste unuttun, parantez eşleşmiyor ya da bir anahtar kelimeyi yanlış yazdın. Son Python sürümleri kabahat karakterine bir ok (^) işaret eder.

Düzeltme: hata mesajı satırı söyler. Git bak. O satırda bariz bir şey yoksa, üstteki satırı kontrol et — birkaç satır yukarıda kapanmamış bir parantez çoğu zaman çok daha sonra syntax error olarak çıkar.

RuntimeError

"Çalışma zamanında daha belirli hatalardan biri olmayan bir şey yanlış gitti" için bir kapsayıcı. RecursionError (özyineleme derinliği aşıldı) yaygın bir özelleşmesidir. Kütüphane kodu, kötü bir durumda olduğunda sıklıkla RuntimeError fırlatır.

Düzeltme: mesajı oku; genellikle açıklayıcıdır. Sebep özyineleme ise, yinelemeli bir döngüye dönüştür ya da nadir durumlarda sys.setrecursionlimit'i yükselt.

Gerçek bir debugger'a uzanmadan önce print() — ya da daha iyisi f"{var=}" biçimi — çoğu bug'ı yakalar:

main.py
Output
Click Run to see the output here.

f"{var=}", hem ifadenin kaynağını hem de değerini yazdırır; adı format string'e yeniden yazmana gerek kalmaz. Script'i çalıştır, çıktıyı tara, bir değerin yanlışa döndüğü satırı bul. Çoğu "gizemli" bug, üç dört iyi yerleştirilmiş print sonrası açığa çıkar.

Commit'ten önce print'leri temizle. Ürüne alacağın kod için logging.debug(...), print'ten daha hoştur — satırları düzenlemeden debug loglamayı açıp kapatabilirsin.

breakpoint() ve pdb

print yetmediğinde breakpoint(), seni o noktada Python'un etkileşimli hata ayıklayıcısına düşürür:

def discount(price, percent):
    breakpoint()
    return price * (1 - percent / 100)

discount(100, 20)

Script'i gerçek bir terminalde çalıştır. (Pdb) prompt'una düşersin. Bilinesi birkaç komut:

  • p variable — bir değişkeni yazdır.
  • n — bir sonraki satıra geç.
  • s — bir fonksiyon çağrısının içine adımla.
  • c — bir sonraki breakpoint'e ya da sona kadar devam et.
  • q — çık.
  • l — o anki satırın çevresindeki kaynağı listele.

IDE debugger'ları (VS Code, PyCharm) aynı protokolü bir GUI'ye sarar — kenar boşluğundan konulan breakpoint'ler, değişkenleri gösteren bir kenar çubuğu. Hangisi daha az sürtünmeliyse onu seç.

Karşılaştığın Hataları Azaltan Alışkanlıklar

  • Açıklayıcı değişken adları kullan. Bir değişkenin içinde ne olduğunu unutamadığında TypeError ve AttributeError gürültüsünün yarısı ortadan kalkar.
  • Girdileri sınırda doğrula. Kullanıcı girdisini / dosya içeriklerini fonksiyonun en başında bir kez ayrıştır ve kontrol et. Kodun geri kalanı artık değerlere güvenebilir.
  • Sessizce değil, yüksek sesle başarısız ol. Çıplak bir except Exception: pass, gerçekten görmen gereken hataları gizler. Belirli istisnaları yakala, kasıtlı olarak ele al ve geri kalanını yayılmaya bırak.
  • Önce traceback'in altını oku. Traceback okumayı öğrenmek için harcadığın her dakika yüz kat geri döner.

Çoğu hata gizem değildir — tek satırlık yazım hataları ya da net bir mesajla gelen yanlış tip hatalarıdır. Hata mesajına güven; genellikle haklıdır.

Başardın

Referans bölümünün sonu bu. "Python nedir?"den başlayıp değişkenler, kontrol akışı, koleksiyonlar, fonksiyonlar, sınıflar, iterasyon, gerçek dünya verileri ve hatalardan geçtin. Buradan sonraki adımlar proje biçimli: inşa etmek istediğin bir şey seç ve daha derin öğrenmen gereken parçalara doğru geri çalış. Belirli bir soruyla döndüğünde bu sayfalar hâlâ burada olacak.

Sıkça Sorulan Sorular

Python'da KeyError nedir?

KeyError, var olmayan bir dict anahtarını aradığında fırlatılır. users["missing"], KeyError: 'missing' fırlatır. Güvenli alternatifler: users.get("missing", default), users.get("missing") (None döner) ya da açık bir if key in users: kontrolü.

Python'da EOFError nedir?

EOFError (end-of-file), input() giriş akışı kapandığı için bir şey okuyamadığında fırlatılır. Bunu en çok, input() kullanan bir script'e veri olmadan pipe yapıldığında ya da etkileşimli prompt'ta Ctrl-D'ye bastığında görürsün. Script'in pipe edilmiş girdiyi ele alması gerekiyorsa try/except EOFError ile koru.

ModuleNotFoundError nedir?

ModuleNotFoundError, import X'in X adında bir modül bulamadığı anlamına gelir. Ya paket kurulu değildir (pip install X), ya da kodunu çalıştırandan farklı bir Python'a kurulmuştur (birden fazla Python olduğunda çok yaygındır). python -m pip install X, aynı yorumlayıcıyı kullanarak ikinci durumu düzeltir.

Python traceback'ini nasıl okurum?

Aşağıdan yukarı oku. Son satır istisna tipi ve mesajıdır — tam olarak ne yanlış gitti. Yukarıdaki satırlar oraya götüren çağrı yığınını gösterir; kendi kodun genellikle alta yakındır. En alttaki, sana ait olan frame'deki dosya ve satıra atla; düzeltmenin yeri orası.

Coddy ile kodlamayı öğren

BAŞLA