Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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