15.3 Error Propagation with the ?
Operator
Explicit match
expressions can become unwieldy when dealing with many sequential operations. The ?
operator propagates errors automatically, reducing boilerplate while preserving explicit error handling.
15.3.1 Mechanism of the ?
Operator
Using ?
on an Err(e)
immediately returns Err(e)
from the current function. If the value is Ok(v)
, v
is extracted and the function continues. An example:
#![allow(unused)] fn main() { use std::fs::File; use std::io::{self, Read}; fn read_username_from_file() -> Result<String, io::Error> { let mut s = String::new(); File::open("username.txt")?.read_to_string(&mut s)?; Ok(s) } }
The ?
operator keeps the code concise and clear. Without it, you’d write multiple match statements or handle each failure manually.