Caro is thinking out loud

Created Last updated

the Result type encodes error handling information

Lots of Rust functions return Result, which is an Enum of Ok and Err. The Ok variant indicates the operation was successful, and inside Ok is the successfully generated value. The Err variant means the operation failed, and Err contains information about how or why the operation failed.

An instance of Result has an expect method . Calling expect() on a Result will make your program crash if it was an Err, or give you back the successful value inside the Ok so you can use it. This can look like

use std::io;

fn main() {
    println!("Guess the number!");

    println!("Please input your guess.");

    let mut guess = String::new();

    io::stdin()
        .read_line(&mut guess)
        .expect("Failed to read line");  // get the value or panic with this message

    println!("You guessed: {guess}");
}

There’s also unwrap() which does a similar thing, but doesn’t let you provide a message to be displayed with the panic. Generally prefer expect() in production code, as it will help with debugging.

Another common pattern if you don’t want to just crash is using unwrap_or_else() (or a bunch of match statments), for example

use std::fs::File;
use std::io::ErrorKind;

fn main() {
    let greeting_file = File::open("hello.txt").unwrap_or_else(|error| {
        if error.kind() == ErrorKind::NotFound {
            File::create("hello.txt").unwrap_or_else(|error| {
                panic!("Problem creating the file: {:?}", error);
            })
        } else {
            panic!("Problem opening the file: {:?}", error);
        }
    });
}

cargo will tell you if you forgot to handle a Result properly with a compiler warning.

Sources