Rust uses Result<T, E> for operations that can fail. No exceptions!
enum Result<T, E> {
Ok(T), // Success with value T
Err(E), // Error with value E
}let result: Result<i32, String> = "42".parse();
match result {
Ok(num) => println!("Parsed: {}", num),
Err(e) => println!("Error: {}", e),
}Propagate errors automatically:
fn read_number() -> Result<i32, String> {
let num = "42".parse().map_err(|_| String::from("parse error"))?;
Ok(num * 2)
}The ? operator can only be used in functions that return Result or Option!
result.unwrap() // Panics on Err
result.expect("msg") // Panics with message
result.unwrap_or(0) // Default value on Err
result.is_ok() // Returns bool
result.is_err() // Returns boolImplement parse_and_double(s) that:
i32Ok(number * 2) on successErr("Invalid number") on failureparse_and_double("21") → Ok(42)parse_and_double("abc") → Err("Invalid number")fn parse_and_double(s: &str) -> Result<i32, String> {
match s.parse::<i32>() {
Ok(n) => Ok(n * 2),
Err(_) => Err(String::from("Invalid number")),
}
}