Error traiti
- Rust kursu
- Orta seviye
- Ders 65/115
- 4 dk
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
use std::error::Error;
use std::fmt;
fn main() {
// buraya yaz
}Örnek çözüm
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<dyn Error></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
impl ____ for YasHatasi {}
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 |