Rust already has most of what I want from error handling: explicit control flow, errors as values, and concise propagation with ?. The friction comes when deciding what to put in the error half of Result. We often end up choosing between precise types that require boilerplate and convenient types that hide which errors can occur. But precision and convenience do not have to be competing goals. Error types should compose as easily as the functions that return them.
This is exactly what it’s for.
#[non_exhaustive]forces you to add a default branch when matching on the error. It’s already used a lot, so without a way to do that, it becomes less useful in library code.