This isn't really specific to Rust's type system, though. It's more related to the philosophy of the language and how the standard library is implemented. You could have the same behaviour in most other traditional programming languages.
Though, Rust's type system and syntactical features probably lend themselves to more ergonomic handling of the various error states.