CodeBlanks Logo Icon CodeBlanks

Özet - İleri hata yönetimi

thiserror ve From'u birleştirerek bir config okuyucu hatası yazarsın.

İleri hata yönetimi özeti

Hata türleri Debug + Display + Error uygular. Kütüphanede somut enum'lar (thiserror), uygulamada esnek tür (anyhow ya da Box<dyn Error>) kullanılır. impl From, ? ile otomatik dönüşüm sağlar. Bağlam (with_context ya da map_err) hatayı anlaşılır kılar. source(), bir hatanın altındaki nedeni verir ve zincir halinde dolaşılabilir.

Hata zinciri

source uygulayan bir hata türü, nedeni kaybetmeden üst düzey bir mesaj verebilir:

#[derive(Debug)]
struct UstHata {
    kaynak: ParseIntError,
}

impl fmt::Display for UstHata {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "yapılandırma yüklenemedi")
    }
}

impl Error for UstHata {
    fn source(&self) -> Option<&(dyn Error + 'static)> {
        Some(&self.kaynak)
    }
}

Zincir while let Some(k) = s { ..; s = k.source(); } ile dolaşılır.

Uygulama Zinciri yazdır

Yukarıdaki UstHata türünü yaz. "x".parse::<i32>().unwrap_err() ile bir örnek oluştur; önce hatayı yazdır, sonra source zincirini neden: MESAJ biçiminde dolaş.

Başlangıç kodu

main.rs
use std::error::Error;
use std::fmt;
use std::num::ParseIntError;

fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
use std::error::Error;
use std::fmt;
use std::num::ParseIntError;

#[derive(Debug)]
struct UstHata {
    kaynak: ParseIntError,
}

impl fmt::Display for UstHata {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "yapılandırma yüklenemedi")
    }
}

impl Error for UstHata {
    fn source(&self) -> Option<&(dyn Error + 'static)> {
        Some(&self.kaynak)
    }
}

fn main() {
    let e = UstHata { kaynak: "x".parse::<i32>().unwrap_err() };
    println!("{}", e);
    let mut s = e.source();
    while let Some(k) = s {
        println!("  neden: {}", k);
        s = k.source();
    }
}

Beklenen çıktı

yapılandırma yüklenemedi
  neden: invalid digit found in string

Soru ve cevaplar

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

1 <code>Error::source</code> varsayılan olarak ne döndürür?

  • Display mesajını
  • Panic verir
  • None Doğru cevap
  • Hatanın kendisini

Açıklama: Alt nedeni olan hata türleri source'u ezerek Some(&iç_hata) döndürür.

2 Nedeni ver

Soru
impl Error for UstHata {
    fn ____(&self) -> Option<&(dyn Error + 'static)> {
        Some(&self.kaynak)
    }
}
Cevap
impl Error for UstHata {
    fn source(&self) -> Option<&(dyn Error + 'static)> {
        Some(&self.kaynak)
    }
}

Açıklama: source alttaki hatayı döndürür.

3 Grubun özeti

Kavram Anlamı
impl Error Hata sözleşmesi
impl From<E> ? ile dönüşüm
with_context Bağlam ekler
source() Alt neden

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