CodeBlanks Logo Icon CodeBlanks

Error traiti

std::error::Error trait'ini uygulayarak kendi hatanı tanımlarsın.

Error trait'i

std::error::Error, hata türlerinin ortak arayüzüdür. Bir türün hata sayılabilmesi için Debug ve Display uygulaması gerekir; Error'ın metotları varsayılan gövdelidir:

use std::error::Error;
use std::fmt;

#[derive(Debug)]
struct YasHatasi(i32);

impl fmt::Display for YasHatasi {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "geçersiz yaş: {}", self.0)
    }
}

impl Error for YasHatasi {}

Display kullanıcıya gösterilecek mesajdır; Debug geliştirici ayrıntısıdır.

Box<dyn Error> ile döndürmek

Kendi hata türün Box<dyn Error>'a dönüşebilir; Display sayesinde {} ile yazdırılır:

fn yas(n: i32) -> Result<u8, Box<dyn Error>> {
    if !(0..=150).contains(&n) {
        return Err(Box::new(YasHatasi(n)));
    }
    Ok(n as u8)
}

match yas(-5) {
    Ok(y) => println!("{y}"),
    Err(e) => println!("{e}"),   // geçersiz yaş: -5
}

Uygulama Yaş denetimi

Yukarıdaki YasHatasi türünü (Debug, Display, Error) ve yas fonksiyonunu yaz. yas(30) sonucunu {:?} ile, yas(-5) hatasını {} ile ayrı satırlara yazdır.

Başlangıç kodu

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

fn main() {
    // buraya yaz
}

Örnek çözüm

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

#[derive(Debug)]
struct YasHatasi(i32);

impl fmt::Display for YasHatasi {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "geçersiz yaş: {}", self.0)
    }
}

impl Error for YasHatasi {}

fn yas(n: i32) -> Result<u8, Box<dyn Error>> {
    if !(0..=150).contains(&n) {
        return Err(Box::new(YasHatasi(n)));
    }
    Ok(n as u8)
}

fn main() {
    println!("{:?}", yas(30).ok());
    if let Err(e) = yas(-5) {
        println!("{}", e);
    }
}

Beklenen çıktı

Some(30)
geçersiz yaş: -5

Soru ve cevaplar

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

1 <code>Box&lt;dyn Error&gt;</code> dönüş türünün avantajı nedir?

  • Daha hızlıdır
  • Hata türünü match ile ayırmak kolaylaşır
  • Panic vermez
  • Error uygulayan her türü ? ile döndürebilir Doğru cevap

Açıklama: Esneklik kazanılır ama somut tür bilgisi kaybolur; çağıran türe göre davranmak isterse downcast gerekir.

2 Error uygula

Soru
impl ____ for YasHatasi {}
Cevap
impl Error for YasHatasi {}

Açıklama: Display ve Debug hazırsa Error boş bir impl ile uygulanır.

3 Trait ve rolü

Kavram Anlamı
Display Kullanıcı mesajı
Debug Geliştirici ayrıntısı
Error Ortak hata arayüzü
Box<dyn Error> Herhangi bir hata

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