Error handling
This is probably a better example about error handling. It needs explanation.
b.txt
0
c.txt
20
fn main() { for file in ["a.txt", "b.txt", "c.txt"].iter() { divide(100, file); } } fn divide(dividend: i32, filename: &str) { let divisor_result = std::fs::read_to_string(filename); // Result<String, Error> match divisor_result { Ok(content) => { let content = content.trim(); match content.parse::<i32>() { Ok(divisor) => { if divisor == 0 { println!("Cannot divide by zero in file {}", filename); } else { println!("{} / {} = {}", dividend, divisor, dividend / divisor); } } Err(_) => { println!("Failed to parse number in file {}", filename); } } } Err(err) => { println!("Error: {err}"); } } }
Error: No such file or directory (os error 2)
Cannot divide by zero in file b.txt
100 / 20 = 5
fn main() { for file in ["a.txt", "b.txt", "c.txt"].iter() { match divide(100, file) { Ok(result) => println!("100 / divisor = {}", result), Err(err) => println!("Error: {}", err), } } } fn divide(dividend: i32, filename: &str) -> Result<i32, String> { let content = std::fs::read_to_string(filename) .map_err(|e| format!("Failed to read file {}: {}", filename, e))?; let divisor = content .trim() .parse::<i32>() .map_err(|_| format!("Failed to parse number in file {}", filename))?; if divisor == 0 { return Err(format!("Cannot divide by zero in file {}", filename)); } Ok(dividend / divisor) }
fn main() { for file in ["a.txt", "b.txt", "c.txt"].iter() { match divide(100, file) { Ok(result) => println!("100 / divisor = {}", result), Err(err) => println!("Error: {}", err), } } } fn divide(dividend: i32, filename: &str) -> Result<i32, Box<dyn std::error::Error>> { let content = std::fs::read_to_string(filename)?; let divisor = content.trim().parse::<i32>()?; if divisor == 0 { return Err("Division by zero is not allowed".into()); } Ok(dividend / divisor) }
Error: No such file or directory (os error 2)
Error: Division by zero is not allowed
100 / divisor = 5