CodeBlanks Logo Icon CodeBlanks

Hata yakalama

parse hatalarını Result ile yönetip kullanıcıyı uyarırsın.

Hata yakalama

Kullanıcı 12 / 0 ya da on * 3 yazabilir. Her hatayı kullanıcıya anlaşılır bir mesajla bildirmek için tüm satırı işleyen bir fonksiyon ? ile zincirlenir:

fn isle(satir: &str) -> Result<f64, String> {
    let p: Vec<&str> = satir.split_whitespace().collect();
    if p.len() != 3 {
        return Err("biçim: SAYI İŞLEM SAYI".to_string());
    }
    let a: f64 = p[0].parse().map_err(|_| format!("geçersiz sayı: {}", p[0]))?;
    let b: f64 = p[2].parse().map_err(|_| format!("geçersiz sayı: {}", p[2]))?;
    if p[1] == "/" && b == 0.0 {
        return Err("sıfıra bölünemez".to_string());
    }
    hesapla(a, p[1], b)
}

Sonucu ele almak

main tarafında match ile hem başarı hem hata yazdırılır; program hata yüzünden çökmez:

match isle("12 / 0") {
    Ok(s) => println!("= {s}"),
    Err(e) => println!("hata: {e}"),
}

unwrap yerine böyle açık ele alma, kullanıcıya dönük programlarda tercih edilir.

Uygulama Satırı işle

Yukarıdaki isle fonksiyonunu (ve basit bir hesaplayı) yaz. ["12 * 3", "12 / 0", "on * 3"] girdileri için match ile = sonuç ya da hata: mesaj yazdır.

Başlangıç kodu

main.rs
fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
fn hesapla(a: f64, op: &str, b: f64) -> Result<f64, String> {
    match op {
        "+" => Ok(a + b),
        "-" => Ok(a - b),
        "*" => Ok(a * b),
        "/" => Ok(a / b),
        _ => Err(format!("bilinmeyen işlem: {op}")),
    }
}

fn isle(line: &str) -> Result<f64, String> {
    let p: Vec<&str> = line.split_whitespace().collect();
    if p.len() != 3 {
        return Err("biçim: SAYI İŞLEM SAYI".to_string());
    }
    let a: f64 = p[0].parse().map_err(|_| format!("geçersiz sayı: {}", p[0]))?;
    let b: f64 = p[2].parse().map_err(|_| format!("geçersiz sayı: {}", p[2]))?;
    if p[1] == "/" && b == 0.0 {
        return Err("sıfıra bölünemez".to_string());
    }
    hesapla(a, p[1], b)
}

fn main() {
    for girdi in ["12 * 3", "12 / 0", "on * 3"] {
        match isle(girdi) {
            Ok(s) => println!("= {s}"),
            Err(e) => println!("hata: {e}"),
        }
    }
}

Beklenen çıktı

= 36
hata: sıfıra bölünemez
hata: geçersiz sayı: on

Soru ve cevaplar

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

1 f64 ile <code>1.0 / 0.0</code> ne verir?

  • 0
  • Derleme hatası
  • inf Doğru cevap
  • panic

Açıklama: Ondalık bölme IEEE 754 kuralını izler ve sonsuz verir; bu yüzden bölen ayrıca kontrol edilir. Tam sayıyı sıfıra bölmek ise panic üretir.

2 Hatayı ilet

Soru
let a: f64 = p[0].parse().map_err(|_| "geçersiz".to_string())____;
Cevap
let a: f64 = p[0].parse().map_err(|_| "geçersiz".to_string())?;

Açıklama: ? hata varsa onu çağırana döndürür; yoksa değeri verir.

3 Girdi ve sonuç

Kavram Anlamı
"12 * 3" = 36
"12 / 0" sıfıra bölünemez
"on * 3" geçersiz sayı: on
"12 *" biçim hatası

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