anyhow
- Rust kursu
- Orta seviye
- Ders 67/115
- 4 dk
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
use std::error::Error;
fn main() {
// buraya yaz
}Örnek çözüm
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<dyn Error></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
if n == 0 {
return Err("sıfır olamaz".____());
}
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 |