11  Hata Yönetimi ve Dosyalar

try/except + with open — NaN guard ve checkpoint persistence

NotBölüm bilgisi

11.1 Bu Derste Ne Var?

Programlarımız artık dış dünyaya dokunacak: kullanıcının yanlış girdisi, eksik dosya, bozuk veri, network kesintisi. Bu derste Python’un bu belirsizliklere karşı savunmasını öğreneceğiz.

flowchart LR
    A["try / except"] --> B["Specific exceptions"]
    B --> C["except E as e"]
    C --> D["with statement"]
    D --> E["open(path, mode)"]
    E --> F["💎 NaN guard"]
    E --> G["💎 Checkpoint persistence"]
    D --> H["torch.no_grad()"]

    style F fill:#fce4ec,stroke:#c2185b,stroke-width:3px
    style G fill:#fce4ec,stroke:#c2185b,stroke-width:3px
    style H fill:#fff3e0,stroke:#f57c00,stroke-width:2px
Şekil 11.1: Ders 10’un akış haritası — try/except’ten ML defansif kodunan

Dersin beş parçası:

  1. try/except ile hata yakalama.
  2. Spesifik exception türleri.ValueError, ZeroDivisionError, FileNotFoundError, TypeError.
  3. with statement — context manager.
  4. Dosya okuma.open(...).read(), readlines(), line iteration.
  5. Dosya yazma."w" mode, "a" append.
İpucuBuilder Notu — Bu Dersin ML Köprüleri
  • try/except = ML training defansif kod. Üretim ML kodu try/except ile sarılı. try: loss.backward() except RuntimeError as e: handle_oom(e) — GPU bellek aşan batch’i akanı bırakmadan toparla.
  • NaN guard pattern. try: loss = compute_loss(batch) except ValueError: continue.
  • Specific exceptions = üretim kalite imzası. Sade except: profesyonel kodda yasak.
  • with open(...) = context manager pattern. ML’de with torch.no_grad(): (inference), with autocast(): (mixed precision), with model.no_sync(): — hepsi aynı with mekanizması.
  • Dosya okuma = data loading. pd.read_csv, torch.load, Image.open, json.load — Mosh’un open() türevleri.
  • Dosya yazma = checkpoint persistence. torch.save(model.state_dict(), "model.pt") arka planda open("model.pt", "wb").
  • Atomic write pattern. .tmp + os.replace — ML için kritik (crash safety).
  • JSON/pickle = ML config + state. Config dosyaları + model state’ler.
  • Logging = log file write. print debug için OK; logging.info(...) üretim.

11.2 Hata Kavramı

Mosh:

“çoğu zaman bunlar […] programınızın çalışmasını tamamen durdurmasına rağmen gerçekleşir. ve aslında yapabileceğimiz şey, dikkat edebileceğimiz.” — Mosh (Türkçe dublaj), 3:04:41

11.2.1 Hata = Exception

Python’da bir hata oluştuğunda exception (istisna) fırlatılır.

sayi = int(input("Sayi gir: "))   # kullanici "abc" girerse hata
print(10 / sayi)                  # kullanici 0 girerse hata

Kullanıcı "abc" girerse:

ValueError: invalid literal for int() with base 10: 'abc'

Program çöker.

11.2.2 Yaygın Exception Türleri

# ValueError - yanlis tipte ama dogru sentaksta:
int("abc")              # ValueError
float("merhaba")        # ValueError

# TypeError - tip uyumsuzlugu:
"merhaba" + 5           # TypeError
len(42)                 # TypeError

# ZeroDivisionError:
10 / 0                  # ZeroDivisionError

# KeyError - dict'te yok:
{"a": 1}["b"]           # KeyError: 'b'

# IndexError:
[1, 2, 3][100]          # IndexError

# NameError - tanimsiz:
print(undefined_var)    # NameError

# FileNotFoundError:
open("yok.txt")         # FileNotFoundError

# AttributeError:
"abc".reverse()         # AttributeError (string'in reverse'i yok)

Her tip kendi anlamını taşır.

11.2.3 ML’de Exception’lar

İpucuBuilder Notu — PyTorch Exception’ları
import torch

# torch.cuda.OutOfMemoryError:
try:
    x = torch.randn(10000, 10000, device="cuda")
except torch.cuda.OutOfMemoryError:
    print("GPU bellek yetersiz")

# RuntimeError - shape mismatch:
try:
    y = torch.randn(3, 4) @ torch.randn(5, 6)
except RuntimeError as e:
    print(f"Tensor shape uyumsuz: {e}")

# ValueError - model konfig hatasi:
try:
    model.load_state_dict(wrong_state_dict)
except ValueError as e:
    print(f"State dict mismatch: {e}")

Her tür farklı sorun → farklı çözüm. except: ile hepsini yakalamak = sorunları görmezden gelmek.

11.3 try/except — Hata Yakalama

Mosh:

“blok dışında denen bir şey bir denemede kabul et blog temelde programlarınızın denemesine izin verir” — Mosh (Türkçe dublaj), 3:06:38

11.3.1 Sentaks

try:
    # tehlikeli kod
    sayi = int(input("Sayi gir: "))
    print(10 / sayi)
except:
    # hata olursa buraya gel
    print("Bir sorun olustu!")

Akış:

  1. try bloğu çalışmaya başlar.
  2. Hata yoksa: except atlanır.
  3. Hata olursa: try’ın geri kalanı atlanır, except çalışır.

11.3.2 Çıplak except: — YASAK

Mosh:

“Python’da en iyi yöntem bunları kullanmaktır. belirli bir hata olduğundan her zaman kabul etmek istersiniz” — Mosh (Türkçe dublaj), 3:12:21

# YASAK:
try:
    risky_function()
except:
    pass    # her şeyi yutmuş

Bir bug ne olduğunu öğrenmek imkansızlaşır.

11.3.3 Spesifik except

try:
    sayi = int(input("Sayi gir: "))
    print(10 / sayi)
except ValueError:
    print("Sayi olarak gecerli degil.")
except ZeroDivisionError:
    print("Sifira bolunemez.")

Üç senaryo, üç farklı işlem.

11.3.4 Birden Fazla Exception Tek Blokta

try:
    ...
except (ValueError, TypeError, KeyError):
    print("Bilinen bir hata")

11.3.5 Exception’ı Yakala — as

try:
    sayi = int(input("Sayi gir: "))
except ValueError as e:
    print(f"Hata detayi: {e}")
    # Hata: invalid literal for int() with base 10: 'abc'

ML kodda kritik:

try:
    model.load_state_dict(state)
except RuntimeError as e:
    print(f"State dict yukleme hatasi: {e}")
    # Hangi katmanin sorunlu oldugunu söyler

11.3.6 else ve finally

try:
    sayi = int(input("Sayi: "))
except ValueError:
    print("Gecersiz!")
else:
    # try BASARIYLA bittiyse:
    print(f"Basarili: {sayi}")
finally:
    # HER DURUMDA:
    print("Temizlik kodu burada")

11.3.7 ML Production Hata Yönetimi

İpucuBuilder Notu — Defansif ML Kodu
import torch
import logging

logger = logging.getLogger(__name__)

def safe_train_step(model, batch, optimizer):
    """Tek bir egitim adimi, defansif sarmalanmis."""
    try:
        loss = model(batch).loss

        # NaN guard:
        if torch.isnan(loss) or torch.isinf(loss):
            logger.warning(f"Invalid loss: {loss.item()}, skipping batch")
            return None

        optimizer.zero_grad()
        loss.backward()
        torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
        optimizer.step()
        return loss.item()

    except torch.cuda.OutOfMemoryError as e:
        logger.error(f"OOM: {e}, clearing cache")
        torch.cuda.empty_cache()
        return None

    except RuntimeError as e:
        logger.error(f"PyTorch runtime error: {e}")
        return None

    except Exception as e:
        logger.exception(f"Unexpected: {e}")
        raise   # bilinmeyen hatalari yukseltel

ML üretim disiplini:

  1. Spesifik exception’lar — her biri ayrı.
  2. Logging — print değil, logger.
  3. OOM toparlama — cache clear, batch atla.
  4. Bilinmeyen hataları yükselt — silent fail YASAK.

11.4 with Statement — Context Manager

Modern Python’un en güzel deyimlerinden.

11.4.1 Sorun

file = open("data.txt", "r")
content = file.read()
file.close()

Eğer file.read() hata atarsa, file.close() çalışmaz. Dosya açık kalır (resource leak).

11.4.2 with Çözümü

with open("data.txt", "r") as file:
    content = file.read()

# file otomatik kapatildi

with Python’un sözünü tuttuğu syntax: bloktan çıkınca otomatik temizlik garanti. Hata olsa bile.

11.4.3 with ML’in Her Yerinde

İpucuBuilder Notu — Context Manager Pattern
import torch

# 1. Gradient hesabini gecici kapat (inference):
with torch.no_grad():
    predictions = model(test_data)

# 2. Mixed precision (FP16):
from torch.cuda.amp import autocast
with autocast():
    output = model(input)

# 3. Distributed training - gradient sync gecici kapat:
with model.no_sync():
    loss.backward()

# 4. Custom context manager - evaluation mode:
from contextlib import contextmanager

@contextmanager
def evaluation_mode(model):
    model.eval()
    try:
        with torch.no_grad():
            yield model
    finally:
        model.train()

with evaluation_mode(model):
    eval_loss = validate(model, val_loader)
# model otomatik train() moduna dondu

PyTorch’ta with her yerde.

11.5 Dosya Okuma

Mosh:

“bilgi almak için bu dosyaları kullanabilirsiniz.” — Mosh (Türkçe dublaj), 3:13:10

11.5.1 open(...) Modları

file = open("data.txt", "r")
Mode Yapar Dosya yoksa Dosya varsa
"r" Oku Hata
"w" Yaz Yarat Sıfırla
"a" Append Yarat Aç, sona ekle
"x" Exclusive Yarat Hata
"rb" Binary oku Hata
"wb" Binary yaz Yarat Sıfırla

11.5.2 Üç Okuma Methodu

with open("data.txt") as f:
    # Yontem 1: tum dosya tek string
    content = f.read()

with open("data.txt") as f:
    # Yontem 2: satir satir liste
    lines = f.readlines()
    # ['ilk satir\n', 'ikinci satir\n', ...]

# Yontem 3: satir satir iteration (EN VERIMLI)
with open("data.txt") as f:
    for line in f:
        print(line.strip())

for line in f: Python’un en sevdiği deyim. Bellek-verimli — büyük dosyalarda tüm dosyayı belleğe almaz.

11.5.3 Defansif Pattern

try:
    with open("config.json") as f:
        config = json.load(f)
except FileNotFoundError:
    print("Config yok, default'lara dusulecek")
    config = {"lr": 1e-3, "batch_size": 32}

11.5.4 Dosya Okuma = ML Veri Yükleme

İpucuBuilder Notu — Her Şey open()’ın türevi
# 1. CSV:
import pandas as pd
df = pd.read_csv("train.csv")    # arka planda open(..., "r")

# 2. JSON:
import json
with open("config.json") as f:
    config = json.load(f)

# 3. Pickle:
import pickle
with open("model.pkl", "rb") as f:    # binary read!
    model = pickle.load(f)

# 4. PyTorch model:
import torch
state = torch.load("model.pt")    # arka planda open(..., "rb") + pickle

# 5. Image:
from PIL import Image
img = Image.open("cat.jpg")

# 6. Text corpus (NLP):
with open("corpus.txt", encoding="utf-8") as f:
    for line in f:
        process_sentence(line.strip())

# 7. Hugging Face dataset:
from datasets import load_dataset
dataset = load_dataset("imdb")    # arka planda yuzlerce dosya okur

Hepsi Mosh’un open(...) kavramının türevleri.

11.6 Dosya Yazma

11.6.1 Write Mode "w" — Sıfırlar

with open("output.txt", "w") as f:
    f.write("Ilk satir\n")
    f.write("Ikinci satir\n")
UyarıDİKKAT

"w" modu dosyayı siler ve yeniden yazar. Eski içerik gider.

11.6.2 Append Mode "a" — Sona Ekler

with open("log.txt", "a") as f:
    f.write("Yeni log entry\n")

"a" mevcut dosyaya eklenir. Eski içerik korunur. Log dosyaları için ideal.

11.6.4 Atomic Write Pattern

ÖnemliBuilder Notu — Crash Safety
# YANLIS:
torch.save(model.state_dict(), "model.pt")
# Eger crash olursa, model.pt yarim yazilmis olur (BOZUK!)

# DOGRU - atomic write:
import os
torch.save(model.state_dict(), "model.pt.tmp")
os.replace("model.pt.tmp", "model.pt")    # atomik rename

ML üretim kodunda her dosya yazma atomic olmalı. Power outage veya crash → bozuk dosya = tüm eğitim kaybı.

11.7 Bu Dersin Özeti

  1. try/except — hata yakalama. Spesifik exception’lar.
  2. as e — exception objesini değişkene al.
  3. else ve finally — başarı sonrası ve her durumda.
  4. with statement — context manager, otomatik temizlik.
  5. open(path, mode) — dosya açma. r, w, a, b.
  6. for line in f — bellek-verimli satır iteration.
  7. Atomic write.tmp + os.replace. ML için kritik.
ÖnemliTek Bir Cümle

try/except Python’a hata yönetimi yetisi kazandırır — Mosh’un try: int(input(...)) except ValueError: ... mikro örneği, modern ML kodunun NaN guard, OOM recovery, ve gradient clipping gibi defansif patternlarının atasıdır; with open(...) as f: context manager pattern’ı, PyTorch’un with torch.no_grad(): ve with autocast(): deyimlerinin birebir aynı yapısıdır; dosya okuma ML veri yüklemenin temeli (pd.read_csv, torch.load, Image.open hepsi open()’in türevidir), dosya yazma ise her epoch’tan sonra checkpoint persistence’ının temelidir.

11.8 Egzersizler

Egzersiz 1. Calculator defansif:

try:
    num1 = float(input("Birinci sayi: "))
    op = input("Islem (+, -, *, /): ")
    num2 = float(input("Ikinci sayi: "))

    if op == "/":
        sonuc = num1 / num2   # ZeroDivisionError olabilir
    ...
except ValueError:
    ???
except ZeroDivisionError:
    ???

Egzersiz 2. Boş olmayan satırların toplam karakter sayısı:

def total_char_count(path):
    try:
        with open(path, encoding="utf-8") as f:
            ???
    except FileNotFoundError:
        ???

Egzersiz 3. Append mode log fonksiyonu:

from datetime import datetime

def log(message, path="app.log"):
    with open(path, "a") as f:
        f.write(f"{datetime.now().isoformat()} - {message}\n")

log("Program baslatildi")
log("Bir hata olustu")

Egzersiz 4. JSON config + default fallback:

import json

def load_config(path, defaults):
    try:
        with open(path, encoding="utf-8") as file:
            return json.load(file)
    except FileNotFoundError:
        print(f"Config yok: {path}")
        return defaults
    except json.JSONDecodeError as e:
        print(f"Config bozuk: {e}")
        return defaults

Egzersiz 5. (Builder eksen — atomic checkpoint)

import os
import json

def save_checkpoint(state, path):
    tmp_path = path + ".tmp"

    try:
        with open(tmp_path, "w") as f:
            json.dump(state, f)
        os.replace(tmp_path, path)    # atomik
    except Exception as e:
        print(f"Save failed: {e}")
        if os.path.exists(tmp_path):
            os.remove(tmp_path)
        raise

state = {"epoch": 5, "loss": 0.234, "params": [1, 2, 3, 4]}
save_checkpoint(state, "model.json")

PyTorch torch.save arka planda aynı şeyi yapar (pickle ile binary).

11.9 Sonraki Ders İçin Hazırlık

Ders 11: Modüller, Paketler, Pip

Mosh’un Ch 30 + Ch 35 (Modules + Pip + Interpreter). Şimdiye kadar tek dosyada yazdığımız kodu organize etmeyi ve kütüphane evrenine açılmayı öğreneceğiz.

  • Mosh’un Ch 30 ve Ch 35’ini izle (3:28:16-3:43:58 + 4:20:46-4:26:47, ~22 dk).
  • Şu cümleyi içselleştir: “Modüller kodu organize eder; pip dış dünya kütüphanelerine kapı açar.”
İpucuBu dersten tek bir şey alıp gideceksen

try/except Python’a hata yönetimi yetisi kazandırır — Mosh’un mikro try: int(input(...)) except ValueError: örneği, modern ML kodunun NaN guard, OOM recovery, atomic checkpoint write disiplinlerinin atasıdır; with open(...) as f: context manager pattern’ı, PyTorch’taki with torch.no_grad(): ve with autocast(): deyimlerinin birebir aynı yapısıdır; üretim kalite ML kodu = Mosh’un üç chapter’ında öğrettiği bu üç kavramın disiplinli uygulanışıdır.