Özet - Hata yönetimi
- Rust kursu
- Başlangıç
- Ders 111/115
- 5 dk
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
#[derive(Debug)]
enum HesapHatasi {
Bos,
Gecersiz(String),
}
fn main() {
// buraya yaz
}Örnek çözüm
#[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
let n: f64 = p.parse().map_err(|_| HesapHatasi::Gecersiz(p.to_string()))____;
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ü |