CodeBlanks Logo Icon CodeBlanks

Özet - Hata yönetimi

Result, ? ve match'i birleştirerek bir sayı okuma fonksiyonu yazarsın.

Hata yönetimi özeti

Beklenen hatalar Result<T, E> ile döndürülür; program hataları panic! ile durdurulur. ? hatayı yukarı yayar ve From ile dönüştürür. Yerinde ele almak için match, if let, unwrap_or, map_err kullanılır. unwrap/expect yalnızca başarısızlığın imkânsız olduğu yerlerde. Uygulamaya özgü hatalar için kendi hata enum'ını tanımlamak iyi bir alışkanlıktır.

Kendi hata türün

Uygulamaya özgü hatalar için bir enum tanımla; her variant bir başarısızlık nedenidir:

#[derive(Debug)]
enum HesapHatasi {
    Bos,
    Gecersiz(String),
}

fn ortalama(s: &str) -> Result<f64, HesapHatasi> {
    if s.trim().is_empty() {
        return Err(HesapHatasi::Bos);
    }
    // her parçayı parse et, hatayı map_err ile Gecersiz'e çevir
    todo!()
}

İleri derslerde bu türe Display ve std::error::Error uygulayıp ? ile diğer hatalarla birleştirmeyi göreceksin.

Uygulama Ortalama hesabı

Yukarıdaki HesapHatasi enum'ı ile fn ortalama(s: &str) -> Result<f64, HesapHatasi> fonksiyonunu tamamla: boş metinde Bos; virgülle ayrılan her parçayı trim edip f64'e çevir, hata olursa Gecersiz(parça) döndür (map_err ve ?). "2,4,9", "" ve "1,x" için sonuçları {:?} ile boşlukla yazdır.

Başlangıç kodu

main.rs
#[derive(Debug)]
enum HesapHatasi {
    Bos,
    Gecersiz(String),
}

fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
#[derive(Debug)]
enum HesapHatasi {
    Bos,
    Gecersiz(String),
}

fn ortalama(s: &str) -> Result<f64, HesapHatasi> {
    if s.trim().is_empty() {
        return Err(HesapHatasi::Bos);
    }
    let mut toplam = 0.0;
    let mut adet = 0;
    for p in s.split(',') {
        let p = p.trim();
        let n: f64 = p.parse().map_err(|_| HesapHatasi::Gecersiz(p.to_string()))?;
        toplam += n;
        adet += 1;
    }
    Ok(toplam / adet as f64)
}

fn main() {
    println!("{:?} {:?} {:?}", ortalama("2,4,9"), ortalama(""), ortalama("1,x"));
}

Beklenen çıktı

Ok(5.0) Err(Bos) Err(Gecersiz("x"))

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Kendi hata enum'ının String hatalara göre avantajı nedir?

  • Daha az bellek kullanır her zaman
  • Panic vermez
  • Derleyici zorunlu tutar
  • Çağıran hata türüne göre match ile farklı davranabilir Doğru cevap

Açıklama: String yalnızca okunabilir; enum ise programın karar vermesini sağlar (ör. Bos için varsayılan, Gecersiz için uyarı).

2 Hatayı çevir ve yay

Soru
let n: f64 = p.parse().map_err(|_| HesapHatasi::Gecersiz(p.to_string()))____;
Cevap
let n: f64 = p.parse().map_err(|_| HesapHatasi::Gecersiz(p.to_string()))?;

Açıklama: map_err hatayı kendi türüne çevirir, ? onu çağırana döndürür.

3 Grubun özeti

Kavram Anlamı
Result<T, E> Beklenen hata
panic! Program hatası
? Hata yayma
enum HesapHatasi Özel hata türü

Başlangıç bölümündeki tüm dersler

16 Proje: Yapılacaklar listesi

  1. Görev modeli
  2. Ekleme
  3. Listeleme
  4. İşaretleme
  5. Komut okuma