mirror of
https://github.com/mainmatter/100-exercises-to-learn-rust
synced 2024-12-25 21:58:26 +01:00
Re-order actions you can take with a Result
It's generally better practice to handle or propagate errors, rather than panicking in response to them. This edit moves panicking to be the _last_ option introduced, rather than the first. It also adds caveats to avoid doing so, and explicitly mentions propagating as something to consider.
This commit is contained in:
parent
9e63a5cdf6
commit
2e2f6b945d
1 changed files with 24 additions and 9 deletions
|
@ -21,16 +21,8 @@ let number = parse_int("42") + 2;
|
|||
|
||||
## You got a `Result`. Now what?
|
||||
|
||||
When you call a function that returns a `Result`, you have two key options:
|
||||
When you call a function that returns a `Result`, you have three key options:
|
||||
|
||||
- Panic if the operation failed.
|
||||
This is done using either the `unwrap` or `expect` methods.
|
||||
```rust
|
||||
// Panics if `parse_int` returns an `Err`.
|
||||
let number = parse_int("42").unwrap();
|
||||
// `expect` lets you specify a custom panic message.
|
||||
let number = parse_int("42").expect("Failed to parse integer");
|
||||
```
|
||||
- Destructure the `Result` using a `match` expression to deal with the error case explicitly.
|
||||
```rust
|
||||
match parse_int("42") {
|
||||
|
@ -38,3 +30,26 @@ When you call a function that returns a `Result`, you have two key options:
|
|||
Err(err) => eprintln!("Error: {}", err),
|
||||
}
|
||||
```
|
||||
- Propagate the error. If you're in a function which also returns a `Result`, you can use the `?` operator to early-return an error if it occurred:
|
||||
```rust
|
||||
let number = parse_int("42")?;
|
||||
println!("Parsed number: {}", number);
|
||||
```
|
||||
|
||||
The `?` operator works the same as manually destructuring the result and early returning:
|
||||
```rust
|
||||
let number = match parse_int("42") {
|
||||
Ok(number) => number,
|
||||
Err(err) => return Err(err),
|
||||
};
|
||||
println!("Parsed number: {}", number);
|
||||
```
|
||||
- Panic if the operation failed.\
|
||||
This is done using either the `unwrap` or `expect` methods.\
|
||||
This this should generally only be done in your top-level `main` function - most functions should propagate errors rather than panic.
|
||||
```rust
|
||||
// Panics if `parse_int` returns an `Err`.
|
||||
let number = parse_int("42").unwrap();
|
||||
// `expect` lets you specify a custom panic message.
|
||||
let number = parse_int("42").expect("Failed to parse integer");
|
||||
```
|
||||
|
|
Loading…
Reference in a new issue