Most failures aren't bugs — a file might not exist, input might be malformed, a network call might time out. These are recoverable, and Rust models them as values with Result<T, E>.
Result, revisited
You met Result as an enum in the Enums track: Ok(T) for success, Err(E) for failure-with-a-reason. The standard library returns it from everything fallible: str::parse, File::open, every I/O call. The caller must engage with the Err case — the compiler won't let it silently slip by.
Handling a Result
You handle it with the tools you know: match on Ok/Err, or combinators like map, map_err, unwrap_or, unwrap_or_else. The key difference from Option is the E: you don't just know that it failed, you know why, and can branch on the reason.
The verbosity problem
Matching every Result by hand gets tedious fast — especially when a function calls five fallible things and wants to bail on the first failure. That tedium is exactly what the ? operator (next lesson) eliminates, turning a five-line match into one character.