Rust
Ö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.
Örnek çözümü göster
#[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"));
}
Kendini test et
-
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
Cevabı göster
Çağıran hata türüne göre match ile farklı davranabilir — String yalnızca okunabilir; enum ise programın karar vermesini sağlar (ör. Bos için varsayılan, Gecersiz için uyarı).
-
Hatayı çevir ve yay
let n: f64 = p.parse().map_err(|_| HesapHatasi::Gecersiz(p.to_string()))____;
Cevabı göster
let n: f64 = p.parse().map_err(|_| HesapHatasi::Gecersiz(p.to_string()))?;
-
Grubun özeti
- Result<T, E>
- Beklenen hata
- panic!
- Program hatası
- ?
- Hata yayma
- enum HesapHatasi
- Özel hata türü
Sıradaki ders: Sesli harf sayacı