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
11 Hata Yönetimi ve Dosyalar
try/except + with open — NaN guard ve checkpoint persistence
- Mosh’un videosu: Chapters 27-29 (Try/Except → Reading → Writing) (≈24 dk)
- Bölüm aralığı: 3:04:23 — 3:28:16
- Kaynaklar: Python docs — errors · Python docs — files · PEP 343 — with statement
- Okuma süresi: ≈45 dk
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.
Dersin beş parçası:
try/exceptile hata yakalama.- Spesifik exception türleri. —
ValueError,ZeroDivisionError,FileNotFoundError,TypeError. withstatement — context manager.- Dosya okuma. —
open(...).read(),readlines(), line iteration. - Dosya yazma. —
"w"mode,"a"append.
try/except= ML training defansif kod. Üretim ML kodutry/exceptile 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’dewith torch.no_grad():(inference),with autocast():(mixed precision),with model.no_sync():— hepsi aynıwithmekanizması.- Dosya okuma = data loading.
pd.read_csv,torch.load,Image.open,json.load— Mosh’unopen()türevleri. - Dosya yazma = checkpoint persistence.
torch.save(model.state_dict(), "model.pt")arka plandaopen("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.
printdebug 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 hataKullanı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
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ış:
trybloğu çalışmaya başlar.- Hata yoksa:
exceptatlanır. - 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öyler11.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
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 yukseltelML üretim disiplini:
- Spesifik exception’lar — her biri ayrı.
- Logging —
printdeğil,logger. - OOM toparlama — cache clear, batch atla.
- 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 kapatildiwith 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
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 donduPyTorch’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 | Aç |
"w" |
Yaz | Yarat | Sıfırla |
"a" |
Append | Yarat | Aç, sona ekle |
"x" |
Exclusive | Yarat | Hata |
"rb" |
Binary oku | Hata | Aç |
"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
# 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 okurHepsi 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")"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.3 print ile Dosyaya Yazma
with open("output.txt", "w") as f:
print("Birinci", file=f)
print("Ikinci", file=f)print(..., file=f) ile print’in normal davranışını dosyaya yönlendir.
11.6.4 Atomic Write Pattern
# 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 renameML üretim kodunda her dosya yazma atomic olmalı. Power outage veya crash → bozuk dosya = tüm eğitim kaybı.
11.7 Bu Dersin Özeti
try/except— hata yakalama. Spesifik exception’lar.as e— exception objesini değişkene al.elsevefinally— başarı sonrası ve her durumda.withstatement — context manager, otomatik temizlik.open(path, mode)— dosya açma.r,w,a,b.for line in f— bellek-verimli satır iteration.- Atomic write —
.tmp+os.replace. ML için kritik.
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 defaultsEgzersiz 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.”
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.