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