İstisnalar, modüller ve sistematik hata ayıklama
Söz dizimi doğru olan bir program her durumda sorunsuz çalışmayabilir. Dosya bulunamayabilir, metin sayıya çevrilemeyebilir, beklenen anahtar sözlükte olmayabilir ya da bir hesapta sayı sıfıra bölünebilir.
Python böyle bir durumda devam edemeyeceğini bir istisna (exception) ile bildirir. Bu hafta program çalışırken çıkan istisnaları try/except ile yakalamayı, gerektiğinde raise ile kendiniz istisna yükseltmeyi ve Python’la birlikte gelen hazır fonksiyon dosyalarını, yani modülleri kullanmayı göreceğiz. Hata ararken de rastgele değil, adım adım ilerleyeceğiz.
Bu sayfadaki kod hücreleri kendiliğinden çalışmaz. Her hücrede önce çıktıyı tahmin edin, sonra Run Code düğmesine basın. Kodu değiştirip yeniden çalıştırabilir, Start Over ile ilk hâline döndürebilirsiniz.
Bu bölümün kapsamı
- Söz dizimi, çalışma zamanı ve mantık hatasının ayrımı
try/exceptile belirli istisnayı yakalama ve genişexceptriskiFileNotFoundError,KeyErrorveValueErroreşlemesiraiseile sözleşme ihlalini bildirme veassertten ayırmaNonesinyali veis Nonedenetimi- Traceback’te hata türü, mesaj ve kendi kodundaki satır
importile modül kullanımı ve main guard’ın ayırdığı iki durum
- Kendi istisna sınıfını tanımlama
loggingmodülü- Adım adım çalıştıran hata ayıklayıcı arayüzü
Bu başlıklar konunun devamıdır. İleride karşınıza çıkar, ama bu derste ezberlemeniz beklenmiyor.
Not dosyasını okuyan programa hangi talimatları verirdiniz?
Her hafta sınıf temsilcisi öğretim elemanına notlar.csv adında bir dosya gönderiyor. Dosyada her öğrencinin adı ve puanı var. Bir program bu dosyayı okuyup sınıfın ortalamasını yazacak. Dosya her hafta düzgün gelmiyor. Geçen dönem şunlar yaşandı:
- Temsilci dosyayı göndermeyi unuttu: klasörde
notlar.csvyok. - Bir öğrencinin puanı yerine
girmediyazılmış. - Temsilci tabloyu başka bir dosyadan kopyalamış: sütunun adı
puandeğil,not. - Bir öğrencinin puanı
-5yazılmış. - Program hiçbir uyarı vermeden ortalamayı
32.5yazdı. Geçerli puanların ortalamasını elle hesaplayınca65çıkıyor.
Programın her durumda ne yapacağını 1. bölümdeki sözde kodla, Türkçe ve madde madde yazın. Program dursun mu, o satırı atlayıp devam mı etsin, size ne yazsın?
Sonra kurallarınızı bir denemeden geçirin. Biri bütün durumlar için tek bir kural öneriyor: “Bir sorun çıkarsa o öğrencinin puanını 0 say ve devam et.” Bu kural beşinci durumu açıklar mı? Üçüncü durumda ortalama kaç çıkar? Bu kuralla programın bir sorun olduğunu size haber verdiği bir durum kalır mı?
Python bilmeniz gerekmiyor: “Dosya yoksa ‘dosya bulunamadı’ yaz ve dur” da bir kural. Kurallarınızı bir kenara yazın. Bölümde her birinin Python’da nasıl yazıldığını göreceğiz. Alıştırmalardan önce listenize döneceğiz.
Hata türlerini ayırmak
Söz dizimi hatası
if puan >= 60
print("Geçti")
if satırının sonundaki iki nokta eksik. Python kodu çalıştırmaya başlamadan SyntaxError verir.
Çalışma zamanı hatası
Aşağıdaki kodun yazımı kurallara uygun. Hücre hangi satırları yazar?
Sorun ancak satır çalıştığında ortaya çıkar. Bu yüzden bu tür hataya çalışma zamanı hatası denir. 10 / 0 satırı ZeroDivisionError, [1, 2][5] satırı IndexError verir. İkinci satırı bunlarla değiştirip deneyin.
Mantık hatası
Program çalışır ama yanlış sonuç verir. Örneğin daire çevresinin formülünü eksik yazalım. Hücre hata verir mi?
Doğru formülde π sayısı için math.pi değerini kullanabiliriz. math, Python’la birlikte kurulan hazır modüllerden, yani standart kütüphaneden biridir. Aşağıdaki hücrede son satır doğru sonucu beklenen değerle karşılaştırıyor. Hücre bir şey yazar mı?
Python mantık hatasını fark etmez. Sonucu beklenen değerle karşılaştırmak size düşer. Son satırdaki assert da bunu yapar: koşul doğruysa hiçbir şey yazmaz, yanlışsa AssertionError verir.
Hata ayıklarken “program çalışıyor mu?” sorusu yetmez. Hatayı nasıl düzelteceğinizi hatanın türü ve programın ne yapması gerektiği belirler.
Yakalanmayan istisna programı durdurur
Python bir satırı çalıştırırken devam edemeyeceği bir durumla karşılaşırsa bir istisna yükseltir. İstisna yakalanmazsa program o noktada durur. Hücre kaç satır yazar?
Hücrenin altında çıkan döküme hata iz dökümü (traceback) denir. Traceback, hatanın hangi satırlardan geçerek oluştuğunu gösterir. En alt satırı türü ve mesajı verir: ValueError, "on" metninin tam sayıya çevrilemediğini söyler.
try / except
try bloğuna hata verebilecek satırları, except bloğuna hata çıkarsa yapılacak işi yazarız. Hücre ne yazar? Sonra metin değerini "abc" yapıp yeniden tahmin edin.
try bloğundaki satırlar sırayla çalışır. Bir satır ValueError yükseltirse bloğun kalanı atlanır ve except ValueError bloğu çalışır.
"42" için dönüşüm başarılıdır ve Sayı: 42 yazılır. except bloğu çalışmaz. "abc" için int() hata verir, print("Sayı:", sayi) satırı atlanır ve yalnız Geçerli bir tam sayı değil yazılır.
Hata nesnesinin mesajını okumak: as e
Bazen Python’ın verdiği asıl mesajı da görmek isteriz: kullanıcıya göstermek ya da hatayı ararken okumak için. e, oluşan istisna nesnesine bu blok içinde verdiğimiz addır. Ayrıntı: satırında ne görürsünüz?
Python’ın mesajını kullanıcıya olduğu gibi göstermek zorunda değilsiniz. Kod yazarken ve hata ararken ise except ... as e ile sorunun ayrıntısını görürsünüz.
Tahmin et: hangi blok çalışır?
Çalıştırmadan önce çıktıyı tahmin edin. Sonra girdi_metni değerini "yetmis" yapıp yeniden tahmin edin: Puan: satırı yazılır mı?
Alıştırma: dönüşüm hatasını yakalayın
Not dosyasındaki ikinci durum: puan yerine girmedi yazılmış. Aşağıdaki kod bu metinde durur.
Kodu try/except ValueError kullanacak biçimde değiştirin. Geçersiz metinde Geçerli sayı değil yazdırılsın.
Hata veren satır int(girdi_metni). Onu ve ardından gelen print() satırını try bloğuna alın.
girdi_metni = "girmedi"
try:
sayi = int(girdi_metni)
print(sayi)
except ValueError:
print("Geçerli sayı değil")Belirli hata türünü yakalamak
Türü yazılmamış bir except bloğu, beklemediğiniz hataları da yakalar ve program hiçbir uyarı vermeden devam eder:
try:
...
except:
...Aşağıdaki kayıtta sütunun adı puan değil, not. Programcı yalnız sayıya çevrilemeyen puanı düşünmüş ve türsüz bir except yazmış. Hücre ne yazar? Program size bir sorun olduğunu söylüyor mu?
0 yazılır. kayit["puan"] satırı KeyError yükseltir, çünkü sözlükte "puan" anahtarı yok. Türsüz except bu hatayı da yakalar ve puanı 0 yapar. Ali’nin puanı 85 olduğu hâlde program hata vermeden 0 kullanır.
Yalnızca sayı dönüşümünde çıkan hatayı bekliyorsanız türünü yazın:
try:
puan = int(kayit["puan"])
except ValueError:
...Kodu okuyan kişi hangi hatanın beklendiğini görür. Beklenmeyen KeyError ise yakalanmaz ve traceback onu gösterir. Yukarıdaki hücrede except: satırını except ValueError: yapıp deneyin.
“Program hiç hata vermesin” diye her şeyi türsüz, geniş bir except ile kapatmak hata ayıklamayı zorlaştırır. Yalnızca beklediğiniz ve karşılığında ne yapacağınızı bildiğiniz hata türlerini yakalayın.
Birden fazla hata türü
Her türü ayrı bir except bloğunda yakaladığınızda hatanın nedenini ayırt edebilirsiniz. Hücrede hangi blok çalışır? Sonra çağrıyı bol("yirmi", 2) yapıp yeniden deneyin.
Python except bloklarına yukarıdan aşağı bakar ve hatanın türüne uyan ilk bloğu çalıştırır.
CSV okurken çıkan üç hata
12. bölümde dosyanın bulunamayabileceğini, bir sütunun eksik olabileceğini ya da bir değerin sayıya çevrilemeyebileceğini söylemiştik. Şimdi bu durumları istisnalarla yakalayalım.
FileNotFoundError
Bu sayfadaki hücrelerin yanında notlar.csv adında bir dosya yok. Hücre ne yazar?
except bloğu yalnızca dosya bulunamadığında çalışır. Dosyanın içindeki veri hataları bu bloğa karışmaz.
KeyError: beklenen sütun yok
DictReader’ın verdiği kayıtta "puan" sütunu yoksa kayit["puan"] erişimi KeyError verir. e bu kez neyi yazar?
Bir CSV dosyasını okurken üç hata bir arada şöyle yakalanır:
import csv
try:
with open("notlar.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)delimiter yanlışsa DictReader satırları doğru sütunlara bölemez. Beklediğiniz sütunlar hiç oluşmayabilir ve sorun sonradan KeyError olarak karşınıza çıkar. Bu yüzden istisnayı yakalamakla yetinmeyin, hatanın kök nedenini (asıl kaynağını) da arayın.
İstisna mı, koşul mu?
Puanın 0 ile 100 arasında olması programın koyduğu bir kuraldır. int("-5") hata vermez, çünkü -5 geçerli bir tam sayıdır. Puanın -5 olamayacağını Python değil, siz bilirsiniz. Bu kuralı if ile denetleriz:
if 0 <= puan <= 100:
...Metnin int() ile sayıya çevrilememesi ise dönüşüm sırasında Python’ın yükselttiği bir istisnadır. Bunu try/except ile yakalarız:
try:
puan = int(girdi_metni)
except ValueError:
...raise: fonksiyon sözleşmesi ihlalini açıkça bildirmek
7. haftada bir fonksiyonun ne beklediğini ve ne döndürdüğünü anlatan yazılı nota sözleşme demiştik. assert ile de programcı olarak kendi beklentimizi sınamış, kullanıcı girdisini denetlemek için uygun olmadığını söylemiştik. Bir fonksiyon geçersiz bir argümanı program çalışırken açıkça reddetmek istiyorsa raise ile kendisi istisna yükseltebilir. Hücre kaç satır yazar?
raise ValueError(...) çağıran koda şunu bildirir: verilen değer bu fonksiyonun sözleşmesine uymuyor. Çağıran kod isterse bunu except ile yakalar.
İki satır yazılır: 250.0 ve Geçersiz girdi: saat 0'dan büyük olmalı. İkinci çağrıda raise satırı çalışır, try bloğunun kalanı atlanır. Bu yüzden Hesap bitti yazılmaz.
Her geçersiz durumda raise kullanmak zorunda değilsiniz. Sıradaki başlıktaki gibi None döndürmek de bir seçenektir. Hangisini seçeceğiniz, çağıran kodun hatayı nasıl karşılayacağına bağlıdır. Seçtiğiniz yolu fonksiyonun sözleşmesine yazın ve bütün geçersiz durumlarda aynı yolu kullanın.
None ile hata sinyali: kolay ama yükü çağırana bırakır
Aşağıdaki fonksiyon puan geçersizse None döndürüyor. Son satır ne yapar?
Avantajı: istisna yükselmez. Çağıran kod sonucu sıradan bir dönüş değeri gibi alır ve kendisi kontrol eder.
Bedeli: fonksiyonu çağıran her yer None olasılığını hesaba katmak zorundadır. Hücrede hata dönüşüm satırında değil, daha ileride çıktı: None ile bir sayı toplanamadığı için TypeError verdi. Büyük bir programda böyle bir hatanın nereden geldiği hemen belli olmaz.
Bu yüzden çağıran kod sözleşmeye uyar ve sonucu kullanmadan önce denetler. Hücre ne yazar? Sonra "abc" yerine "85" yazıp deneyin.
Neden is None?
Python’da tek bir None nesnesi vardır. Bu yüzden önerilen kontrol şöyle yazılır:
if sonuc is None:
...
if sonuc is not None:
...sonuc == None yerine is None yazılır. is, iki tarafın aynı nesneyi gösterip göstermediğini sınar. En sık kullanıldığı yer de None kontrolüdür.
14. haftadaki bütünleştirici uygulamada if kayit is None: ve assert ... is None satırlarını göreceksiniz. Orada == yerine is bilerek seçildi: None için kimlik kontrolü yapılıyor.
None mı raise mı?
İki yol da duruma göre doğru 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 yerde except ile yakalar
Bu derste iki yolu da kullanıyoruz. Benzer problemlerde ikisini rastgele karıştırmıyor, hangisini seçtiğimizi fonksiyonun sözleşmesinde açıkça yazıyoruz.
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'
Bir traceback’i şu sırayla okuyun:
- En alttaki hata türünü bulun.
- Hata mesajını okuyun.
- Kendi dosyanıza ait en alttaki satırı bulun.
- O satıra hangi değerlerin geldiğini kontrol edin.
- Sorunu daha küçük bir örnekle yeniden oluşturun.
Bu örnekte hata rapor.py dosyasının 5. satırında, float("abc") çağrısında çıkıyor. 12. satır, o fonksiyonu çağıran satırdır.
Hata ayıklamanın yedi adımı
- Yeniden oluştur: Hata hangi girdiyle çıkıyor?
- Beklenen davranışı yaz: Ne olmalıydı?
- Küçült: Hatayı gösteren en küçük örneği bulun.
- Gözlemle: Değişkenlerin değerlerine ya da traceback’e bakın.
- Bir neden seç: Hatanın nedeni hakkında tek bir tahmin seçin.
- Tek değişiklik yap: Yalnızca bu tahmini sınayacak küçük bir düzeltme yapın.
- Yeniden doğrula: Hem sorunlu hem sorunsuz girdiyi deneyin.
Bu adımları izleyen biri satırları rastgele değiştirmez. Her adımda neyi sınadığını bilir.
Modül nedir?
Modül, fonksiyon ve değer tanımlarını bir arada tutan bir Python dosyasıdır. Bir modülü import ile programınıza alır, içindekileri kullanırsınız. Standart kütüphaneden bir örnek: hücre hangi iki sayıyı yazar?
Tarih işlemleri için datetime modülü var. Hücre bugünün tarihini yazar:
Karekök, π sayısı ya da bugünün tarihi için kendi kodunuzu yazmanız gerekmez. Bu işler standart kütüphanedeki modüllerde hazır bulunur.
Tahmin et ve çalıştır: math
İki print() ne yazar? İkincisi, 8. haftada gördüğümüz f-string biçimlendirmesiyle sonucu iki ondalık basamakla yazdırır.
Kendi modülümüz
Kendi yazdığınız her .py dosyası da bir modüldür. Örneğin hesaplar.py dosyası:
def kdv_hesapla(tutar, oran):
return tutar * oran
def indirimli_fiyat(fiyat, oran):
return fiyat - fiyat * oranAynı klasördeki başka bir dosyadan bu modülü şöyle kullanırsınız:
import hesaplar
print(hesaplar.kdv_hesapla(500, 0.20))Modülden yalnızca bir fonksiyonu da alabilirsiniz:
from hesaplar import kdv_hesapla
print(kdv_hesapla(500, 0.20))Main guard
Aşağıdaki if __name__ == "__main__": kalıbına main guard denir:
def main():
print("Program başladı")
if __name__ == "__main__":
main()Bir dosyayı başka bir dosyadan import ile kullanmaya içe aktarmak denir. Main guard iki durumu birbirinden ayırır:
- Dosya doğrudan çalıştırılırsa
main()çağrılır. - Dosya başka bir dosyadan modül olarak içe aktarılırsa
main()kendiliğinden çağrılmaz.
Alıştırma: modül fonksiyonunu kullanın
Beklenen sonuç 5.0’dır.
import math
def hipotenus(a, b):
return math.sqrt(a ** 2 + b ** 2)Mantık hatasında assert
Fonksiyon 100 TL’lik ürüne %20 indirim uygulayıp 80 döndürmeli. Hücre çalışınca ne olur?
Fonksiyon çalışır ve kendi içinde istisna yükselmez, ama 80 yerine 20.0 döndürür. assert satırı beklenen değeri gerçek sonuçla karşılaştırır ve AssertionError verir. Mantık hatası böylece fark edilir. Doğru fonksiyon:
def indirimli_fiyat(fiyat, oran):
return fiyat - fiyat * oranSoruya dönelim: not dosyasındaki beş durum Python’da
Bölümün başında not dosyasını okuyan programa talimat yazmıştınız. Beş durumun Python’daki karşılıkları şöyle:
| Durum | Sözde kodda | Python’da | Dikkat |
|---|---|---|---|
notlar.csv yok |
“Dosya yoksa ‘notlar.csv bulunamadı’ yaz ve dur” | except FileNotFoundError: |
Çalışma zamanı hatası. Yakalanmazsa traceback dosyanın adını gösterir |
Puan yerine girmedi |
“Puan sayı değilse o öğrenciyi atla ve kimi atladığını yaz” | int() ValueError yükseltir, except ValueError: yakalar |
Atlanan öğrenciyi 0 saymak ortalamayı düşürür |
Sütunun adı not |
“Puan sütunu yoksa dur ve hangi sütunun bulunamadığını yaz” | except KeyError as e: |
“Sorun çıkarsa 0 say” kuralı burada bütün sınıfa 0 verir ve ortalama 0 çıkar. Türsüz except tam olarak bu kuraldır |
Puan -5 |
“Puan 0 ile 100 arasında değilse geçersiz say” | if 0 <= puan <= 100: denetimi. Fonksiyon geçersiz puanda None döndürür ya da raise ValueError(...) ile bildirir |
int("-5") hata vermez. Kuralı programcı koyar. None dönüyorsa çağıran is None ile denetler |
Ortalama 32.5, olması gereken 65 |
“Sonucunu bildiğim küçük bir dosyayla dene, sonuçları karşılaştır” | assert ortalama == 65 |
Mantık hatası mesaj vermez. Burada geçersiz puanlar 0 sayılıp bölmeye katılmış |
Listenizi tabloyla karşılaştırın. Bütün durumlara tek bir “sorun çıkarsa 0 say” kuralı yazdıysanız üçüncü ve beşinci satıra bakın: program hiç durmadan yanlış bir ortalama yazar ve size haber vermez. Her durum için ayrı bir kural yazdıysanız Python’da her biri ayrı bir except bloğuna ya da if denetimine karşılık gelir.
Üret: güvenli puan dönüştürme
Not dosyasındaki ikinci ve dördüncü durumu bir fonksiyonda çözelim. Fonksiyon dosyadan gelen puan metnini alacak.
Fonksiyon şu kurallara uysun:
- Metin tam sayıya çevrilemiyorsa
Nonedöndürür. - Sayı
0–100arasındaysa sayının kendisini döndürür. - Sayı bu aralığın dışındaysa
Nonedöndürür. - Fonksiyonun içinde
print()kullanılmaz.
Beklenen çıktı: 85, None, None.
def puani_coz(metin):
try:
puan = int(metin)
except ValueError:
return None
if 0 <= puan <= 100:
return puan
return NoneFonksiyon çalışınca sonuçları yazdırmakla kalmayın, sözleşmeyi assert ile de sınayın:
assert puani_coz("85") == 85
assert puani_coz("girmedi") is None
assert puani_coz("-5") is NoneSıra sizde: sınıf ortalaması
Aşağıdaki liste, notlar.csv dosyasından okunmuş dört kaydı taklit ediyor. puani_coz() fonksiyonunu kullanarak yalnız geçerli puanların ortalamasını hesaplayın ve atlanan öğrencilerin adını yazdırın. Son satırdaki assert, beşinci durumdaki hatanın tekrar etmediğini sınar.
Başlangıç kodu henüz hiçbir puanı saymadığı için sayi 0 kalır ve son satırlarda ZeroDivisionError verir. Döngüyü yazınca bu hata kaybolur. Beklenen çıktı: Atlandı: Ece, Atlandı: Can ve Ortalama: 65.0.
Döngüde puan = puani_coz(kayit["puan"]) yazın. puan is None ise adı yazdırın, değilse toplam’a ekleyip sayi’yı bir artırın.
def puani_coz(metin):
try:
puan = int(metin)
except ValueError:
return None
if 0 <= puan <= 100:
return puan
return None
kayitlar = [
{"ad": "Ali", "puan": "85"},
{"ad": "Ece", "puan": "girmedi"},
{"ad": "Can", "puan": "-5"},
{"ad": "Su", "puan": "45"},
]
toplam = 0
sayi = 0
for kayit in kayitlar:
puan = puani_coz(kayit["puan"])
if puan is None:
print("Atlandı:", kayit["ad"])
else:
toplam = toplam + puan
sayi = sayi + 1
ortalama = toplam / sayi
print("Ortalama:", ortalama)
assert ortalama == 65Hata ayıklama kontrol listesi
- Hata türü nedir: söz dizimi, çalışma zamanı, mantık?
- Sorunu aynı girdiyle yeniden oluşturabiliyor 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 eile gerçek mesajı görmem yararlı olur mu?Nonedöndürebilen bir fonksiyonun sonucunu çağıran kod kontrol ediyor mu?- Tek bir tahmini sınayacak küçük bir değişiklik yapabilir miyim?
- Düzeltme sonrası hem sorunlu hem normal örneği yeniden denedim mi?
Tek sayfa özet
- Söz dizimi hatası kod çalışmadan önce yazımda, çalışma zamanı hatası kod çalışırken, mantık hatası ise yanlış sonuçta ortaya çıkar.
- Mantık hatasında program çalışır ama sonuç yanlıştır. Python bunu fark etmez, sonucu
assertile beklenen değerle karşılaştırmak gerekir. - Python devam edemediği bir durumda istisna yükseltir. Yakalanmayan istisna programı durdurur ve bir traceback yazdırır.
try/exceptile beklediğiniz belirli istisnaları yakalarsınız. Türü yazılmamış genişexceptgerçek hataları gizler: eksik sütun bile hata vermeden0puana dönüşebilir.except ... as eile istisnanın mesajını okuyabilirsiniz.- Eksik dosya, eksik sütun ve sayıya çevrilemeyen değer sırasıyla
FileNotFoundError,KeyErrorveValueErrorile yakalanır. int("-5")hata vermez. Puanın0ile100arasında olması gibi kuralları programcıifile denetler.raise ValueError(...), sözleşmeye uymayan bir değeri çağıran koda açıkça bildirir.- Hata sinyali olarak
Nonedöndürülebilir. Bunun bedeli, çağıranın her seferindeis Nonekontrolü yapmasıdır. - Traceback’i okumaya en alttaki hata türü ve mesajdan başlayın, sonra kendi kodunuzdaki satırı bulun.
- Hata ayıklarken sorunu yeniden oluşturur, küçültür, gözlemler, bir neden seçer ve düzeltmeyi doğrularsınız.
- Standart kütüphane modülleri
importile kullanılır. Kendi yazdığınız Python dosyaları da birer modüldür. - Main guard, dosyanın doğrudan çalıştırıldığı durumu modül olarak içe aktarıldığı durumdan ayırır.
Son bölümde yeni kavram yok. İlk 13 haftanın araçlarıyla CSV okuyan, modüllere ayrılmış, hataları yakalayan, koleksiyonlarla çalışan ve kendini assert ile sınayan küçük bir uygulama yazacağız.
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ırt eder.
try/exceptile belirli bir istisnayı yakalar ve genişexceptriskini açıklar.FileNotFoundError,KeyErrorveValueError’ı doğru duruma eşler.raiseile sözleşme ihlalini bildirir ve bunuassertten ayırır.Nonesinyalini kullanır ve sonucuis Noneile denetler.- Traceback’ten hata türünü, mesajı ve hatanın kendi kodundaki yerini okur.
importile modül kullanır ve main guard’ın ne ayırdığını açıklar.