Rust
thiserror
thiserror crate'i ile derive edilen hata türleri oluşturursun.
thiserror
Kütüphanelerde hata türleri genellikle bir enum'dır ve her variant için Display yazmak tekrarlıdır. thiserror crate'i bunu derive ile üretir:
// Cargo.toml: thiserror = "1"
use thiserror::Error;
#[derive(Debug, Error)]
enum AyarHatasi {
#[error("eksik anahtar: {0}")]
Eksik(String),
#[error("geçersiz değer: {anahtar}={deger}")]
Gecersiz { anahtar: String, deger: String },
}
Ürettiği kod, elle yazacağın impl Display ve impl Error ile birebir aynıdır; çalışma anı maliyeti yoktur.
Elle yazılan karşılığı
Alıştırma ortamında dış crate olmadığı için aynı türü elle yazacağız. thiserror'ın arkasında olan budur:
impl fmt::Display for AyarHatasi {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
AyarHatasi::Eksik(a) => write!(f, "eksik anahtar: {a}"),
AyarHatasi::Gecersiz { anahtar, deger } => {
write!(f, "geçersiz değer: {anahtar}={deger}")
}
}
}
}
impl std::error::Error for AyarHatasi {}
Uygulama Ayar hataları
AyarHatasi enum'ını Eksik(String) ve Gecersiz { anahtar, deger } variant'larıyla tanımla; Display ve Error'ı elle uygula. Eksik("port") ve Gecersiz { anahtar: "port", deger: "abc" } değerlerini ayrı satırlara {} ile yazdır.
Örnek çözümü göster
use std::fmt;
#[derive(Debug)]
enum AyarHatasi {
Eksik(String),
Gecersiz { anahtar: String, deger: String },
}
impl fmt::Display for AyarHatasi {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
AyarHatasi::Eksik(a) => write!(f, "eksik anahtar: {a}"),
AyarHatasi::Gecersiz { anahtar, deger } => {
write!(f, "geçersiz değer: {anahtar}={deger}")
}
}
}
}
impl std::error::Error for AyarHatasi {}
fn main() {
let a = AyarHatasi::Eksik(String::from("port"));
let b = AyarHatasi::Gecersiz {
anahtar: String::from("port"),
deger: String::from("abc"),
};
println!("{}", a);
println!("{}", b);
}
Kendini test et
-
<code>thiserror</code> mı <code>anyhow</code> mı? Genel kural nedir?
- Her yerde thiserror
- İkisi aynı şeyi yapar
- Kütüphanede thiserror (somut türler), uygulamada anyhow (tek esnek tür)
- Her yerde anyhow
Cevabı göster
Kütüphanede thiserror (somut türler), uygulamada anyhow (tek esnek tür) — Kütüphane kullanıcısı hatayı türüne göre ele almak ister; uygulama ise çoğunlukla hatayı raporlar.
-
Mesaj özniteliği
#[derive(Debug, Error)]
enum AyarHatasi {
#[____("eksik anahtar: {0}")]
Eksik(String),
}
Cevabı göster
#[derive(Debug, Error)]
enum AyarHatasi {
#[error("eksik anahtar: {0}")]
Eksik(String),
}
-
Değer ve mesajı
- Eksik("port")
- eksik anahtar: port
- Gecersiz { port, abc }
- geçersiz değer: port=abc
- #[error("{0}")]
- İlk alan
- #[error(transparent)]
- İçteki hatanın mesajı
Sıradaki ders: anyhow