CodeBlanks Logo Icon CodeBlanks

anyhow

anyhow crate'i ile esnek hata yönetimi yaparsın.

anyhow

Uygulamalarda farklı kaynaklardan gelen hataları tek bir türde toplamak çoğu zaman yeterlidir. anyhow::Result<T>, Result<T, anyhow::Error>'un kısaltmasıdır ve her hata türünü ? ile kabul eder:

// Cargo.toml: anyhow = "1"
use anyhow::{bail, Result};

fn oku(s: &str) -> Result<i32> {
    let n: i32 = s.trim().parse()?;
    if n == 0 {
        bail!("sıfır olamaz");
    }
    Ok(100 / n)
}

bail! biçimlenmiş mesajla hemen Err döndürür. Standart kütüphanedeki yakın karşılığı Box<dyn Error>'dır.

std ile aynı desen

Alıştırmada anyhow yerine standart karşılığını kullanacağız; yapı aynıdır:

use std::error::Error;

fn oku(s: &str) -> Result<i32, Box<dyn Error>> {
    let n: i32 = s.trim().parse()?;       // ParseIntError → Box
    if n == 0 {
        return Err("sıfır olamaz".into()); // &str → Box
    }
    Ok(100 / n)
}

anyhow buna ek olarak bağlam ekleme, hata zinciri yazdırma ve geri izleme (backtrace) sunar.

Uygulama Esnek hata türü

Yukarıdaki oku fonksiyonunu Box<dyn Error> ile yaz. "4", "abc" ve "0" için başarıda sonucu, hatada hata: MESAJ yazdır.

Başlangıç kodu

main.rs
use std::error::Error;

fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
use std::error::Error;

fn oku(s: &str) -> Result<i32, Box<dyn Error>> {
    let n: i32 = s.trim().parse()?;
    if n == 0 {
        return Err("sıfır olamaz".into());
    }
    Ok(100 / n)
}

fn main() {
    for g in ["4", "abc", "0"] {
        match oku(g) {
            Ok(n) => println!("{}", n),
            Err(e) => println!("hata: {}", e),
        }
    }
}

Beklenen çıktı

25
hata: invalid digit found in string
hata: sıfır olamaz

Soru ve cevaplar

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

1 Bir metin <code>Box&lt;dyn Error&gt;</code>'a nasıl çevrilir?

  • panic!("mesaj")
  • "mesaj".into() ya da Box::from("mesaj") Doğru cevap
  • Çevrilemez
  • Error::new("mesaj")

Açıklama: Standart kütüphane &str ve String için From<..> for Box<dyn Error> uygulaması sağlar.

2 Metinden hata

Soru
if n == 0 {
    return Err("sıfır olamaz".____());
}
Cevap
if n == 0 {
    return Err("sıfır olamaz".into());
}

Açıklama: into, &str'yi Box<dyn Error>'a dönüştürür.

3 Girdi ve oku sonucu

Kavram Anlamı
"4" 25
" 10 " 10
"abc" invalid digit found in string
"0" sıfır olamaz

Orta seviye bölümündeki tüm dersler