İstisnalar, modüller ve sistematik hata ayıklama

Bir programın doğru sözdizimine sahip olması, her durumda sorunsuz çalışacağı anlamına gelmez. Dosya bulunamayabilir, metin sayıya dönüştürülemeyebilir, beklenen anahtar sözlükte olmayabilir veya bir hesap sıfıra bölme yapabilir.

Bu hafta istisna (exception) kavramını, try/except ile belirli çalışma zamanı sorunlarını ele almayı, gerektiğinde raise ile açık hata üretmeyi, standart kütüphane modüllerini kullanmayı ve hata ayıklamayı daha sistematik bir sürece dönüştürmeyi öğreneceğiz.

Bu bölümün kapsamı

NoteSınavda sorulur
  • söz dizimi, çalışma zamanı ve mantık hatasının ayrımı
  • try / except ile belirli istisnayı ele alma ve geniş except riski
  • FileNotFoundError, KeyError ve ValueError eşlemesi
  • raise ile sözleşme ihlalini bildirme ve assertten ayırma
  • None sinyali ve is None denetimi
  • traceback’te hata türü, mesaj ve kendi kodundaki satır
  • import ile modül kullanımı ve main guard’ın ayırdığı iki durum
  • kendi istisna sınıfını tanımlama
  • logging modülü
  • adım adım çalıştıran hata ayıklayıcı arayüzü

Bu başlıklar konunun devamıdır; ileride karşınıza çıkar ama bu derste ezberlemeniz beklenmiyor.

Program hata vermiyor ama sonuç yanlış; bu ne tür bir hatadır?

Hataların hepsi kırmızı bir mesajla gelmez. Önce hatayı türüne göre ayıracak, sonra beklenen hataları kontrollü biçimde karşılamayı ve bir traceback’i baştan sona okumayı öğreneceğiz.

Hata türlerini ayırmak

Söz dizimi hatası

if puan >= 60
    print("Geçti")

İki nokta eksiktir ve SyntaxError oluşur.

Çalışma zamanı hatası

sayi = int("abc")       # ValueError
# 10 / 0               # ZeroDivisionError
# [1, 2][5]            # IndexError

Kod sözdizimsel olarak geçerlidir; sorun yürütme sırasında ortaya çıkar.

Mantık hatası

Program çalışır fakat yanlış sonuç üretir. Örneğin daire çevresinin formülünü eksik yazalım:

def daire_cevresi(yaricap):
    return 3.14 * yaricap   # Hatalı: 2 çarpanı eksik

Doğru formülü standart kütüphanedeki math.pi ile açıkça yazabiliriz:

import math

def daire_cevresi(yaricap):
    return 2 * math.pi * yaricap
assert abs(daire_cevresi(1) - 2 * math.pi) < 0.000001

Bu tür sorunları Python otomatik olarak her zaman fark edemez; beklenen davranışla karşılaştırmak gerekir.

Important

Hata ayıklamada ilk soru yalnızca “program çalışıyor mu?” değildir. Sorun hangi sınıfa ait ve beklenen davranış neydi? soruları düzeltme yöntemini belirler.

Söz dizimi, çalışma zamanı ve mantık hatalarının karşılaştırılması.

Programlama hatalarının türleri

İstisna nedir?

Python çalışırken olağan akışı sürdüremediği bir durumla karşılaştığında istisna oluşturabilir:

int("on")

ValueError oluşur. Hata türü ve mesajı yalnızca “program bozuldu” demek değildir; sorunun niteliği hakkında bilgi taşır.

try / except

metin = "42"

try:
    sayi = int(metin)
    print("Sayı:", sayi)
except ValueError:
    print("Geçerli bir tam sayı değil")

metin = "abc" olduğunda dönüşüm başarısız olur ve yalnızca ValueError bloğu çalışır.

Hata nesnesinin mesajını okumak: as e

Bazen kullanıcıya göstermek veya hata ayıklarken görmek için Python’ın gerçek istisna mesajını da incelemek isteriz:

metin = "abc"

try:
    sayi = int(metin)
except ValueError as e:
    print("Hata türü: ValueError")
    print("Ayrıntı:", e)

Buradaki e, oluşan istisna nesnesine verdiğimiz yerel addır. Örneğin mesaj invalid literal for int() with base 10: 'abc' olabilir.

Note

Kullanıcıya ham hata mesajını her zaman aynen göstermek zorunda değilsiniz. Ancak geliştirme ve hata ayıklama sırasında except ... as e gerçek sorunun ayrıntısını görmeye yardım eder.

Tahmin et — hangi blok çalışır?

Önce "75", sonra "yetmis" ile sonucu tahmin edin.

Alıştırma — dönüşüm hatasını ele alın

Kodu try/except ValueError kullanacak biçimde değiştirin; geçersiz metinde Geçerli sayı değil yazdırılsın.

girdi_metni = "abc"

try:
    sayi = int(girdi_metni)
    print(sayi)
except ValueError:
    print("Geçerli sayı değil")

Belirli hata türünü yakalamak

Şu kullanım birçok beklenmeyen problemi sessizce yutabilir:

try:
    ...
except:
    ...

Yalnızca sayı dönüşüm hatasını yönetiyorsanız:

try:
    sayi = int(metin)
except ValueError:
    ...

daha açıklayıcıdır.

Warning

“Program hiçbir zaman hata vermesin” diye her şeyi geniş bir except ile kapatmak hata ayıklamayı zorlaştırır. Yalnızca anlamlı biçimde ele alabildiğiniz ve beklediğiniz hata türlerini yakalayın.

Birden fazla hata türü

def bol(metin, bolen):
    sayi = int(metin)
    return sayi / bolen

try:
    sonuc = bol("20", 0)
    print(sonuc)
except ValueError:
    print("Metin sayıya dönüştürülemedi")
except ZeroDivisionError:
    print("Sıfıra bölme yapılamaz")

Ayrı hata türleri ayrı nedenleri görünür kılar.

12. haftanın dosya hataları

Geçen hafta “dosya bulunamıyor, sütun yok, dönüşüm bozuk olabilir” demiştik. Şimdi bunları doğrudan ele alalım.

FileNotFoundError

try:
    with open("veri.csv", "r", encoding="utf-8") as dosya:
        icerik = dosya.read()
except FileNotFoundError as e:
    print("Dosya bulunamadı: veri.csv")
    print("Ayrıntı:", e)

Bu blok yalnızca dosyanın bulunamaması durumunu yönetir. Dosyanın içindeki veri hatalarını aynı başlık altında gizlemez.

KeyError: beklenen sütun/alan yok

DictReader kaydında "puan" sütunu yoksa köşeli parantez erişimi KeyError oluşturabilir:

kayit = {"ad": "Deniz"}

try:
    puan = int(kayit["puan"])
except KeyError as e:
    print("Beklenen alan bulunamadı:", e)

Gerçek CSV örneğinde:

import csv

try:
    with open("ogrenciler.csv", "r", encoding="utf-8-sig", newline="") as dosya:
        okuyucu = csv.DictReader(dosya, delimiter=";")

        for kayit in okuyucu:
            puan = int(kayit["puan"])
            print(kayit["ad"], puan)
except FileNotFoundError as e:
    print("CSV dosyası bulunamadı:", e)
except KeyError as e:
    print("CSV sütunu eksik:", e)
except ValueError as e:
    print("Sayısal dönüşüm başarısız:", e)
Important

Yanlış delimiter kullanırsanız DictReader beklediğiniz sütunları hiç üretmeyebilir ve bu da daha sonra KeyError olarak görünür. Hata türünü yakalamak kadar kök nedeni araştırmak da önemlidir.

İstisna mı, koşul mu?

Puanın 0 ile 100 arasında olması normal bir iş kuralıdır:

if 0 <= puan <= 100:
    ...

Metnin int() ile dönüştürülememesi ise dönüşüm sırasında oluşan bir istisnadır:

try:
    puan = int(girdi_metni)
except ValueError:
    ...

raise: fonksiyon sözleşmesi ihlalini açıkça bildirmek

  1. haftada assert ifadelerini geliştiricinin beklentisini doğrulamak için kullanmış, kullanıcı girdisi yönetiminin aracı olmadığını söylemiştik. Bir fonksiyonun geçersiz argümanı çalışma zamanında açıkça reddetmesi gerekiyorsa istisna üretebilir:
def saat_ucreti(toplam_ucret, saat):
    if saat <= 0:
        raise ValueError("saat 0'dan büyük olmalı")

    return toplam_ucret / saat

Çağıran kod isterse bunu yakalar:

try:
    print(saat_ucreti(1000, 0))
except ValueError as e:
    print("Geçersiz girdi:", e)

raise ValueError(...), “bu fonksiyonun sözleşmesine göre verilen değer geçersiz” bilgisini çağıran koda taşır.

Note

Her geçersiz durumda mutlaka raise kullanmak zorunda değilsiniz. Tasarım seçimi, çağıranın hatayla nasıl çalışacağına bağlıdır. Önemli olan fonksiyonun sözleşmesinin açık ve tutarlı olmasıdır.

None ile hata sinyali: kolay ama sorumluluğu çağırana taşır

Şu tasarım geçersiz puanda None döndürüyor:

def puani_coz(metin):
    try:
        puan = int(metin)
    except ValueError:
        return None

    if 0 <= puan <= 100:
        return puan

    return None

Avantajı: çağıran kod sonucu normal bir değer gibi alabilir ve açıkça kontrol edebilir.

Bedeli: her çağıran None durumunu hatırlamak zorundadır.

puan = puani_coz("abc")
# print(puan + 10)  # TypeError: None ile int toplanamaz

Hata artık dönüşüm satırında değil, daha ileride ve bağlamı daha belirsiz bir yerde ortaya çıkabilir.

Bu nedenle çağıran kod:

puan = puani_coz("abc")

if puan is None:
    print("Puan çözülemedi")
else:
    print("Yeni puan:", puan + 10)

biçiminde sözleşmeye uymalıdır.

Neden is None?

None Python’da tekil bir özel nesnedir. Geleneksel ve önerilen kontrol biçimi:

if sonuc is None:
    ...

if sonuc is not None:
    ...

şeklindedir; sonuc == None yazmak yerine is None kullanılır. Burada is, iki ifadenin aynı nesneyi gösterip göstermediğini sınar; None kontrolü bu kullanımın en yaygın örneklerindendir.

Important
  1. haftadaki bütünleştirici uygulamada if kayit is None: ve assert ... is None göreceksiniz. Bunlar == operatörünün rastgele bir varyasyonu değil, None için bilinçli kimlik kontrolleridir.

Noneraise mı?

İki tasarım da bağlama göre anlamlı olabilir:

None döndürme
→ geçersizlik beklenen bir sonuç seçeneği olabilir
→ çağıran her seferinde kontrol etmelidir

raise ValueError
→ sözleşme ihlalini akıştan ayırır
→ çağıran isterse uygun sınırda except ile yakalar

Bu derste iki yaklaşımı da tanıyoruz; aynı tür problemler içinde keyfî biçimde karıştırmak yerine sözleşmeyi açık tutuyoruz.

Traceback okumak

Traceback (most recent call last):
  File "rapor.py", line 12, in <module>
    toplam = fiyat_hesapla("abc")
  File "rapor.py", line 5, in fiyat_hesapla
    fiyat = float(metin)
ValueError: could not convert string to float: 'abc'

Başlangıçta:

  1. En alttaki hata türünü bulun.
  2. Hata mesajını okuyun.
  3. Kendi kodunuzdaki ilgili son satırı bulun.
  4. O satıra hangi değerlerin geldiğini kontrol edin.
  5. Sorunu daha küçük örnekle yeniden üretin.

Sistematik hata ayıklama

  1. Yeniden üret: Hangi girdiyle oluşuyor?
  2. Beklenen davranışı yaz: Ne olmalıydı?
  3. Küçült: Sorunlu işlemi mümkün olan en küçük örneğe indir.
  4. Gözlemle: Değerleri veya traceback’i incele.
  5. Hipotez kur: Tek bir olası neden seç.
  6. Tek değişiklik yap: Hipotezi sınayacak en küçük düzeltme.
  7. Yeniden doğrula: Hem sorunlu hem normal girdiyi dene.

Bu süreç hata ayıklamayı “rastgele satır değiştirme” işinden ölçülebilir bir incelemeye dönüştürür.

Modül nedir?

Standart kütüphaneden örnek:

import math

print(math.sqrt(81))
print(math.pi)

Başka örnek:

from datetime import date

bugun = date.today()
print(bugun)

Ana fikir: ihtiyacımız olan bazı işlevler Python’ın standart kütüphanesinde modüller olarak bulunur.

Tahmin et ve çalıştır — math

İkinci çıktı 8. haftadaki f-string biçimlendirmesiyle iki ondalık basamak gösterir.

Kendi modülümüz

hesaplar.py:

def kdv_hesapla(tutar, oran):
    return tutar * oran

def indirimli_fiyat(fiyat, oran):
    return fiyat - fiyat * oran

Başka dosyada:

import hesaplar

print(hesaplar.kdv_hesapla(500, 0.20))

veya:

from hesaplar import kdv_hesapla
print(kdv_hesapla(500, 0.20))

Main guard

Bir Python dosyasının doğrudan çalıştırılması ile modül olarak import edilmesinde main guard davranışı.

main guard ve import davranışı
def main():
    print("Program başladı")

if __name__ == "__main__":
    main()

Temel fikir:

  • Dosya doğrudan çalıştırılırsa main() çağrılır,
  • Dosya modül olarak içe aktarılırsa bu çağrı otomatik çalışmaz.

Alıştırma — modül fonksiyonunu kullanın

Beklenen sonuç 5.0dır.

import math

def hipotenus(a, b):
    return math.sqrt(a ** 2 + b ** 2)

Mantık hatasında assert

def indirimli_fiyat(fiyat, oran):
    return fiyat * oran

assert indirimli_fiyat(100, 0.20) == 80

İstisna yoktur; assert beklenen davranış ile gerçek sonuç arasındaki farkı görünür kılar. Doğru fonksiyon:

def indirimli_fiyat(fiyat, oran):
    return fiyat - fiyat * oran

Üret — güvenli puan dönüştürme

Kurallar:

  • Metin tam sayıya dönüştürülemiyorsa None,
  • Sayı 0100 arasındaysa sayı,
  • Aralık dışındaysa None,
  • Fonksiyon içinde print() yok.

Beklenen: 85, None, None.

def puani_coz(metin):
    try:
        puan = int(metin)
    except ValueError:
        return None

    if 0 <= puan <= 100:
        return puan

    return None

Fonksiyon çalıştıktan sonra yalnızca sonucu yazdırmak yerine sözleşmeyi de sınayın:

assert puani_coz("85") == 85
assert puani_coz("abc") is None
assert puani_coz("120") is None

Hata ayıklama kontrol listesi

  • Hata türü nedir: söz dizimi, çalışma zamanı, mantık?
  • Sorunu aynı girdiyle yeniden üretebiliyor muyum?
  • Beklenen sonuç nedir?
  • Sorunu daha küçük örneğe indirebilir miyim?
  • Traceback hangi hata türünü, mesajı ve satırı gösteriyor?
  • O satırdaki değişkenlerin değerleri nedir?
  • except ... as e ile gerçek mesajı görmem yararlı olur mu?
  • None dönen bir sözleşmeyi çağıran kod kontrol ediyor mu?
  • Tek bir hipotezi sınayacak küçük değişiklik yapabilir miyim?
  • Düzeltme sonrası hem sorunlu hem normal örneği yeniden denedim mi?

Sınav provası

Önce kendi cevabını seç; sonra cevap anahtarında her şıkkın neden doğru veya yanlış olduğunu oku. Çeldiriciler uydurma değil, bu konuda gerçekten yapılan hatalardır. Sınav maddeleri de bu mantıkla yazılır.

Madde 1. Söz dizimi hatası, çalışma zamanı hatası ve mantık hatası nasıl ayrılır?

  • A. Mantık hatası her zaman bir hata mesajı üretir
  • B. Çalışma zamanı hatası kod yazılırken yakalanır
  • C. Üçü de programı hemen durdurur
  • D. Söz dizimi hatası kod okunurken, çalışma zamanı hatası yürütme sırasında ortaya çıkar; mantık hatası ise hata vermez ama yanlış sonuç üretir
  • E. Söz dizimi hatası yalnızca büyük programlarda çıkar

Madde 2. Bir daire çevresi fonksiyonu math.pi * yaricap yazıyor ve hiç hata vermiyor ama sonuçlar hep yarı çıkıyor. Bu nasıl bir hatadır?

  • A. Çalışma zamanı hatası
  • B. Kodlama hatası
  • C. Söz dizimi hatası
  • D. ValueError
  • E. Mantık hatası; formül eksik yazılmış, doğrusu 2 * math.pi * yaricaptır

Madde 3. Aşağıdaki kod neden sorunludur?

try:
    puan = int(satir["puan"])
except:
    puan = 0
  • A. except hiçbir tür belirtmediği için yazım hatasından bellek sorununa kadar her istisnayı yakalar; gerçek hatalar sessizce gizlenir
  • B. Sorun yok; geniş except daha güvenlidir
  • C. try bloğu tek satırdan oluştuğu için
  • D. puan değişkeni iki kez atandığı için
  • E. int() çağrısı try içinde kullanılamaz

Madde 4. CSV işleyen bir programda “dosya yok” ve “beklenen sütun yok” durumları sırasıyla hangi istisnalara karşılık gelir?

  • A. İkisi de OSError üretir
  • B. FileNotFoundError ve KeyError
  • C. ValueError ve TypeError
  • D. IndexError ve NameError
  • E. KeyError ve FileNotFoundError

Madde 5. raise ValueError(...) ile assert hangi amaçlarda ayrılır?

  • A. raise yalnızca try bloğu içinde kullanılabilir
  • B. assert programı hiçbir zaman durdurmaz
  • C. raise çağıran koda sözleşme ihlalini bildirir ve üretimde beklenen bir yoldur; assert geliştirme sırasında beklentiyi hızlıca sınamak içindir
  • D. assert çağıran koda hata bildirir; raise yalnızca test içindir
  • E. İkisi de aynıdır; raise yalnızca daha okunaklıdır

Madde 6. None denetimi neden sonuc == None yerine sonuc is None biçiminde yazılır?

  • A. None bir sayı olduğu için == uygun değildir
  • B. is daha hızlı olduğu için zorunludur
  • C. == None yazımı hata verir
  • D. None tek bir nesnedir; is kimlik denetimi yapar ve eşitlik davranışı özelleştirilmiş türlerde yanıltmaz
  • E. İkisi farklı sonuç verir; is None her zaman True döner

Madde 7. Bir traceback okurken hangi üç bilgiyi aramak yararlıdır?

  • A. Python sürümü, işletim sistemi ve dosya boyutu
  • B. Programın çalışma süresi, bellek kullanımı ve çıkış kodu
  • C. Yalnızca en üstteki satır; gerisi önemsizdir
  • D. Değişken adları, tür adları ve girinti düzeyi
  • E. Hata türü, hata mesajı ve kendi kodunuzda geçen en alttaki satır

Madde 8. import math satırı ne yapar?

  • A. math modülünü programa dâhil eder; içindeki adlara math.pi gibi modül adıyla erişilir
  • B. math içindeki bütün adları doğrudan kullanılabilir yapar
  • C. math adlı bir dosya oluşturur
  • D. Programın matematik işlemlerini hızlandırır
  • E. math modülünü internetten indirir

Madde 9. if __name__ == "__main__": satırı hangi iki kullanımı birbirinden ayırır?

  • A. Söz dizimi hatası ile çalışma zamanı hatasını
  • B. Dosyanın doğrudan çalıştırılması ile başka bir dosyadan modül olarak içe aktarılması
  • C. Yerel değişken ile küresel değişkeni
  • D. Fonksiyon tanımı ile fonksiyon çağrısını
  • E. Okuma kipi ile yazma kipini

Madde 1 — Doğru: D. En tehlikelisi mantık hatasıdır; çünkü program sorunsuz çalışır ve yanlışlık ancak sonuç denetlenirse fark edilir.

  • A yanlış: Mesaj üretmemesi tam da onu zor bulunur kılar.
  • B yanlış: Yazım sırasında yakalanan söz dizimi hatasıdır.
  • C yanlış: Mantık hatası programı durdurmaz.
  • E yanlış: Tek satırlık bir kodda da çıkabilir.

Madde 2 — Doğru: E. Kod geçerli ve çalışıyor; yanlış olan yalnızca hesabın kendisi. Bu tür hatalar ancak sonuç doğrulanırsa görünür.

  • A yanlış: Program hata vermeden tamamlanıyor.
  • B yanlış: Kodlama metin çözümlemesiyle ilgilidir; burada formül yanlış.
  • C yanlış: Kod sorunsuz okunuyor ve çalışıyor.
  • D yanlış: Hiçbir istisna oluşmuyor.

Madde 3 — Doğru: A. Beklenen istisnalar açıkça yazılmalıdır: except (ValueError, KeyError): gibi. Aksi hâlde başka bir kusur da 0 olarak geçer.

  • B yanlış: Geniş except güvenli değildir; hataları görünmez kılar.
  • C yanlış: Tek satırlık try bloğu önerilen bir uygulamadır; sorun exceptte.
  • D yanlış: İki koldan birinin atama yapması beklenen davranıştır.
  • E yanlış: Kullanılabilir; zaten tam olarak bunun için konur.

Madde 4 — Doğru: B. Açılamayan dosya ilkini, sözlükte bulunamayan sütun adı ikincisini üretir.

  • A yanlış: Eksik sütun bir işletim sistemi hatası değildir.
  • C yanlış: ValueError dönüştürülemeyen değerde, TypeError uyumsuz türde çıkar.
  • D yanlış: İlki sınır dışı indekste, ikincisi tanımsız adda çıkar.
  • E yanlış: İki istisna ters eşleştirilmiş.

Madde 5 — Doğru: C. assert kontrolleri çalışma seçenekleriyle kapatılabilir; bu yüzden girdiyi doğrulamanın tek dayanağı olarak kullanılmaz.

  • A yanlış: Her yerde kullanılabilir.
  • B yanlış: Koşul yanlışsa AssertionError verip durdurur.
  • D yanlış: Roller ters yazılmış.
  • E yanlış: Amaçları ve kullanım yerleri farklıdır.

Madde 6 — Doğru: D. Python’un yerleşik yazım kuralı da budur. is None niyeti doğrudan anlatır.

  • A yanlış: None sayı değildir; ayrı bir değerdir.
  • B yanlış: Hız kaygısı değil, doğruluk ve okunabilirlik gerekçesidir.
  • C yanlış: Hata vermez; yalnızca önerilen yazım değildir.
  • E yanlış: is None yalnızca değer gerçekten None ise True döner.

Madde 7 — Doğru: E. Traceback’in alt kısmı türü ve mesajı verir; kitaplık satırları arasında kendi dosyanızı bulmak aramayı doğrudan daraltır.

  • A yanlış: Bunlar traceback’in çözümünde kullanılmaz.
  • B yanlış: Traceback bu bilgileri vermez.
  • C yanlış: En üst satır genellikle en dıştaki çağrıdır; en açıklayıcı bilgi altta durur.
  • D yanlış: Bunlar dolaylı ipuçları olabilir ama traceback’in ana bilgileri değildir.

Madde 8 — Doğru: A. Modül adıyla erişim, hangi aracın nereden geldiğini okurken görünür kılar.

  • B yanlış: Bu from math import * davranışıdır ve önerilmez.
  • C yanlış: Dosya oluşturmaz; var olan modülü yükler.
  • D yanlış: import bir hızlandırma aracı değildir.
  • E yanlış: math standart kütüphanenin parçasıdır; Python ile birlikte gelir.

Madde 9 — Doğru: B. Böylece modülü import eden bir dosya, o modülün deneme kodlarını istemeden çalıştırmaz.

  • A yanlış: Hata türleriyle ilgisi yoktur.
  • C yanlış: Kapsam ayrımı farklı bir konudur.
  • D yanlış: Bu ayrım def ve çağrı satırlarıyla yapılır.
  • E yanlış: Dosya kipleri open() çağrısına aittir.

Tek sayfa özet

  • Söz dizimi hatası kodun yapısında, çalışma zamanı hatası yürütme sırasında, mantık hatası sonuç davranışında ortaya çıkar.
  • Mantık hatasının düzeltilmiş sonucu da gösterilmelidir; daire_cevresi için doğru formül 2 * math.pi * yaricaptır.
  • try/except, beklenen belirli istisnaları anlamlı biçimde ele almaya yarar; geniş except gerçek hataları gizleyebilir.
  • except ... as e istisnanın mesajını incelemeyi sağlar.
    1. haftadaki dosya/sütun/dönüşüm sorunları FileNotFoundError, KeyError, ValueError gibi belirli istisnalarla ele alınabilir.
  • raise ValueError(...), fonksiyon sözleşmesi ihlalini çağıran koda açıkça bildirebilir.
  • None hata/sonuç sinyali kullanılabilir; bunun bedeli çağıranın her seferinde is None kontrolü yapmasıdır.
  • None için önerilen kontrol is None / is not None biçimidir.
  • Traceback’te hata türü, mesaj ve kendi kodunuzdaki ilgili satır iyi başlangıç noktalarıdır.
  • Hata ayıklama yeniden üretme, küçültme, gözlemleme, hipotez kurma ve doğrulama sürecidir.
  • Standart kütüphane modülleri import ile kullanılabilir; kendi Python dosyalarımız da modül olabilir.
  • Main guard, dosyanın doğrudan çalıştırılması ile modül olarak içe aktarılması davranışlarını ayırır.

Bir sonraki bölümde yeni kavram eklemeyeceğiz. İlk 13 haftadaki araçları birlikte kullanarak CSV, modül, hata yönetimi, koleksiyonlar ve doğrulamayı birleştiren küçük bir bütünleştirici uygulama geliştireceğiz.

Bu bölümün kazanımları

Bu bölümü bitiren öğrenci:

  • Söz dizimi, çalışma zamanı ve mantık hatasını birbirinden ayırır.
  • try / except ile belirli bir istisnayı ele alır ve geniş except riskini bilir.
  • FileNotFoundError, KeyError ve ValueError’ı doğru duruma eşler.
  • raise ile sözleşme ihlalini bildirir ve bunu assertten ayırır.
  • None sinyalini kullanır ve is None denetimini uygular.
  • Traceback’ten hata türünü, mesajı ve kendi kodundaki ilgili satırı okur.
  • import ile modül kullanır ve main guard’ın ne ayırdığını açıklar.
Back to top