Hata yakalama
- Rust kursu
- Başlangıç
- Ders 28/115
- 6 dk
parse hatalarını Result ile yönetip kullanıcıyı uyarırsın.
Hata yakalama
Kullanıcı 12 / 0 ya da on * 3 yazabilir. Her hatayı kullanıcıya anlaşılır bir mesajla bildirmek için tüm satırı işleyen bir fonksiyon ? ile zincirlenir:
fn isle(satir: &str) -> Result<f64, String> {
let p: Vec<&str> = satir.split_whitespace().collect();
if p.len() != 3 {
return Err("biçim: SAYI İŞLEM SAYI".to_string());
}
let a: f64 = p[0].parse().map_err(|_| format!("geçersiz sayı: {}", p[0]))?;
let b: f64 = p[2].parse().map_err(|_| format!("geçersiz sayı: {}", p[2]))?;
if p[1] == "/" && b == 0.0 {
return Err("sıfıra bölünemez".to_string());
}
hesapla(a, p[1], b)
}Sonucu ele almak
main tarafında match ile hem başarı hem hata yazdırılır; program hata yüzünden çökmez:
match isle("12 / 0") {
Ok(s) => println!("= {s}"),
Err(e) => println!("hata: {e}"),
}unwrap yerine böyle açık ele alma, kullanıcıya dönük programlarda tercih edilir.
Uygulama Satırı işle
Yukarıdaki isle fonksiyonunu (ve basit bir hesaplayı) yaz. ["12 * 3", "12 / 0", "on * 3"] girdileri için match ile = sonuç ya da hata: mesaj yazdır.
Başlangıç kodu
fn main() {
// buraya yaz
}Örnek çözüm
fn hesapla(a: f64, op: &str, b: f64) -> Result<f64, String> {
match op {
"+" => Ok(a + b),
"-" => Ok(a - b),
"*" => Ok(a * b),
"/" => Ok(a / b),
_ => Err(format!("bilinmeyen işlem: {op}")),
}
}
fn isle(line: &str) -> Result<f64, String> {
let p: Vec<&str> = line.split_whitespace().collect();
if p.len() != 3 {
return Err("biçim: SAYI İŞLEM SAYI".to_string());
}
let a: f64 = p[0].parse().map_err(|_| format!("geçersiz sayı: {}", p[0]))?;
let b: f64 = p[2].parse().map_err(|_| format!("geçersiz sayı: {}", p[2]))?;
if p[1] == "/" && b == 0.0 {
return Err("sıfıra bölünemez".to_string());
}
hesapla(a, p[1], b)
}
fn main() {
for girdi in ["12 * 3", "12 / 0", "on * 3"] {
match isle(girdi) {
Ok(s) => println!("= {s}"),
Err(e) => println!("hata: {e}"),
}
}
}Beklenen çıktı
= 36 hata: sıfıra bölünemez hata: geçersiz sayı: on
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 f64 ile <code>1.0 / 0.0</code> ne verir?
- 0
- Derleme hatası
- inf Doğru cevap
- panic
Açıklama: Ondalık bölme IEEE 754 kuralını izler ve sonsuz verir; bu yüzden bölen ayrıca kontrol edilir. Tam sayıyı sıfıra bölmek ise panic üretir.
2 Hatayı ilet
let a: f64 = p[0].parse().map_err(|_| "geçersiz".to_string())____;
let a: f64 = p[0].parse().map_err(|_| "geçersiz".to_string())?;
Açıklama: ? hata varsa onu çağırana döndürür; yoksa değeri verir.
3 Girdi ve sonuç
| Kavram | Anlamı |
|---|---|
"12 * 3" |
= 36 |
"12 / 0" |
sıfıra bölünemez |
"on * 3" |
geçersiz sayı: on |
"12 *" |
biçim hatası |