|
1 | 1 | //! Error handling with the `Result` type.
|
2 | 2 | //!
|
3 | 3 | //! [`Result<T, E>`][`Result`] is the type used for returning and propagating
|
4 |
| -//! errors. It is an enum with the variants, [`Ok(T)`], representing |
5 |
| -//! success and containing a value, and [`Err(E)`], representing error |
6 |
| -//! and containing an error value. |
| 4 | +//! errors. It is an enum with the variants, [`Ok(T)`], representing success and |
| 5 | +//! containing a value, and [`Err(E)`], representing error and containing an |
| 6 | +//! error value. |
7 | 7 | //!
|
8 | 8 | //! ```
|
9 | 9 | //! # #[allow(dead_code)]
|
|
13 | 13 | //! }
|
14 | 14 | //! ```
|
15 | 15 | //!
|
16 |
| -//! Functions return [`Result`] whenever errors are expected and |
17 |
| -//! recoverable. In the `std` crate, [`Result`] is most prominently used |
18 |
| -//! for [I/O](../../std/io/index.html). |
| 16 | +//! Functions return [`Result`] whenever errors are expected and recoverable. In |
| 17 | +//! the `std` crate, [`Result`] is most prominently used for |
| 18 | +//! [I/O](../../std/io/index.html). |
19 | 19 | //!
|
20 |
| -//! A simple function returning [`Result`] might be |
21 |
| -//! defined and used like so: |
| 20 | +//! A simple function returning [`Result`] might be defined and used like so: |
22 | 21 | //!
|
23 | 22 | //! ```
|
24 | 23 | //! #[derive(Debug)]
|
|
40 | 39 | //! }
|
41 | 40 | //! ```
|
42 | 41 | //!
|
43 |
| -//! Pattern matching on [`Result`]s is clear and straightforward for |
44 |
| -//! simple cases, but [`Result`] comes with some convenience methods |
45 |
| -//! that make working with it more succinct. |
| 42 | +//! Pattern matching on [`Result`]s is clear and straightforward for simple |
| 43 | +//! cases, but [`Result`] comes with some convenience methods that make working |
| 44 | +//! with it more succinct. |
46 | 45 | //!
|
47 | 46 | //! ```
|
48 | 47 | //! let good_result: Result<i32, i32> = Ok(10);
|
|
68 | 67 | //!
|
69 | 68 | //! # Results must be used
|
70 | 69 | //!
|
71 |
| -//! A common problem with using return values to indicate errors is |
72 |
| -//! that it is easy to ignore the return value, thus failing to handle |
73 |
| -//! the error. [`Result`] is annotated with the `#[must_use]` attribute, |
74 |
| -//! which will cause the compiler to issue a warning when a Result |
75 |
| -//! value is ignored. This makes [`Result`] especially useful with |
76 |
| -//! functions that may encounter errors but don't otherwise return a |
77 |
| -//! useful value. |
| 70 | +//! A common problem with using return values to indicate errors is that it is |
| 71 | +//! easy to ignore the return value, thus failing to handle the error. |
| 72 | +//! [`Result`] is annotated with the `#[must_use]` attribute, which will cause |
| 73 | +//! the compiler to issue a warning when a Result value is ignored. This makes |
| 74 | +//! [`Result`] especially useful with functions that may encounter errors but |
| 75 | +//! don't otherwise return a useful value. |
78 | 76 | //!
|
79 |
| -//! Consider the [`write_all`] method defined for I/O types |
80 |
| -//! by the [`Write`] trait: |
| 77 | +//! Consider the [`write_all`] method defined for I/O types by the [`Write`] |
| 78 | +//! trait: |
81 | 79 | //!
|
82 | 80 | //! ```
|
83 | 81 | //! use std::io;
|
|
87 | 85 | //! }
|
88 | 86 | //! ```
|
89 | 87 | //!
|
90 |
| -//! *Note: The actual definition of [`Write`] uses [`io::Result`], which |
91 |
| -//! is just a synonym for <code>[Result]<T, [io::Error]></code>.* |
| 88 | +//! *Note: The actual definition of [`Write`] uses [`io::Result`], which is just |
| 89 | +//! a synonym for <code>[Result]<T, [io::Error]></code>.* |
92 | 90 | //!
|
93 |
| -//! This method doesn't produce a value, but the write may |
94 |
| -//! fail. It's crucial to handle the error case, and *not* write |
95 |
| -//! something like this: |
| 91 | +//! This method doesn't produce a value, but the write may fail. It's crucial to |
| 92 | +//! handle the error case, and *not* write something like this: |
96 | 93 | //!
|
97 | 94 | //! ```no_run
|
98 | 95 | //! # #![allow(unused_must_use)] // \o/
|
|
105 | 102 | //! file.write_all(b"important message");
|
106 | 103 | //! ```
|
107 | 104 | //!
|
108 |
| -//! If you *do* write that in Rust, the compiler will give you a |
109 |
| -//! warning (by default, controlled by the `unused_must_use` lint). |
| 105 | +//! If you *do* write that in Rust, the compiler will give you a warning (by |
| 106 | +//! default, controlled by the `unused_must_use` lint). |
110 | 107 | //!
|
111 |
| -//! You might instead, if you don't want to handle the error, simply |
112 |
| -//! assert success with [`expect`]. This will panic if the |
113 |
| -//! write fails, providing a marginally useful message indicating why: |
| 108 | +//! You might instead, if you don't want to handle the error, simply assert |
| 109 | +//! success with [`expect`]. This will panic if the write fails, providing a |
| 110 | +//! marginally useful message indicating why: |
114 | 111 | //!
|
115 | 112 | //! ```no_run
|
116 | 113 | //! use std::fs::File;
|
|
145 | 142 | //!
|
146 | 143 | //! # The question mark operator, `?`
|
147 | 144 | //!
|
148 |
| -//! When writing code that calls many functions that return the |
149 |
| -//! [`Result`] type, the error handling can be tedious. The question mark |
150 |
| -//! operator, [`?`], hides some of the boilerplate of propagating errors |
151 |
| -//! up the call stack. |
| 145 | +//! When writing code that calls many functions that return the [`Result`] type, |
| 146 | +//! the error handling can be tedious. The question mark operator, [`?`], hides |
| 147 | +//! some of the boilerplate of propagating errors up the call stack. |
152 | 148 | //!
|
153 | 149 | //! It replaces this:
|
154 | 150 | //!
|
|
209 | 205 | //!
|
210 | 206 | //! *It's much nicer!*
|
211 | 207 | //!
|
212 |
| -//! Ending the expression with [`?`] will result in the [`Ok`]'s unwrapped value, unless the result |
213 |
| -//! is [`Err`], in which case [`Err`] is returned early from the enclosing function. |
| 208 | +//! Ending the expression with [`?`] will result in the [`Ok`]'s unwrapped |
| 209 | +//! value, unless the result is [`Err`], in which case [`Err`] is returned early |
| 210 | +//! from the enclosing function. |
214 | 211 | //!
|
215 |
| -//! [`?`] can be used in functions that return [`Result`] because of the |
216 |
| -//! early return of [`Err`] that it provides. |
| 212 | +//! [`?`] can be used in functions that return [`Result`] because of the early |
| 213 | +//! return of [`Err`] that it provides. |
217 | 214 | //!
|
218 | 215 | //! [`expect`]: Result::expect
|
219 | 216 | //! [`Write`]: ../../std/io/trait.Write.html "io::Write"
|
220 |
| -//! [`write_all`]: ../../std/io/trait.Write.html#method.write_all "io::Write::write_all" |
| 217 | +//! [`write_all`]: ../../std/io/trait.Write.html#method.write_all |
| 218 | +//! "io::Write::write_all" |
221 | 219 | //! [`io::Result`]: ../../std/io/type.Result.html "io::Result"
|
222 | 220 | //! [`?`]: crate::ops::Try
|
223 | 221 | //! [`Ok(T)`]: Ok
|
|
227 | 225 | //! # Representation
|
228 | 226 | //!
|
229 | 227 | //! In some cases, [`Result<T, E>`] will gain the same size, alignment, and ABI
|
230 |
| -//! guarantees as [`Option<T>`] has. One of either the `T` or `E` type must be a |
231 |
| -//! type that qualifies for `Option` guarantees, and the *other* type must meet |
232 |
| -//! all of the following conditions: |
| 228 | +//! guarantees as [`Option<U>`] has. One of either the `T` or `E` type must be a |
| 229 | +//! type that qualifies for the `Option` [representation guarantees][opt-rep], |
| 230 | +//! and the *other* type must meet all of the following conditions: |
233 | 231 | //! * Is a zero-sized type with alignment 1 (a "1-ZST").
|
234 | 232 | //! * Has no fields.
|
235 | 233 | //! * Does not have the `#[non_exhaustive]` attribute.
|
236 | 234 | //!
|
237 |
| -//! For example, `Result<NonZeroI32, ()>` or `Result<(), NonZeroI32>` would both |
238 |
| -//! have the same guarantees as `Option<NonZeroI32>`. The only difference is the |
239 |
| -//! implied semantics: `Result<NonZeroI32, ()>` is "a non-zero success value" |
240 |
| -//! while `Result<(), NonZeroI32>` is "a non-zero error value". |
| 235 | +//! For example, `NonZeroI32` qualifies for the `Option` representation |
| 236 | +//! guarantees, and `()` is a zero-sized type with alignment 1, no fields, and |
| 237 | +//! it isn't `non_exhaustive`. This means that both `Result<NonZeroI32, ()>` and |
| 238 | +//! `Result<(), NonZeroI32>` have the same size, alignment, and ABI guarantees |
| 239 | +//! as `Option<NonZeroI32>`. The only difference is the implied semantics: |
| 240 | +//! * `Option<NonZeroI32>` is "a non-zero i32 might be present" |
| 241 | +//! * `Result<NonZeroI32, ()>` is "a non-zero i32 success result, if any" |
| 242 | +//! * `Result<(), NonZeroI32>` is "a non-zero i32 error result, if any" |
| 243 | +//! |
| 244 | +//! [opt-rep]: ../option/index.html#representation "Option Representation" |
241 | 245 | //!
|
242 | 246 | //! # Method overview
|
243 | 247 | //!
|
244 |
| -//! In addition to working with pattern matching, [`Result`] provides a |
245 |
| -//! wide variety of different methods. |
| 248 | +//! In addition to working with pattern matching, [`Result`] provides a wide |
| 249 | +//! variety of different methods. |
246 | 250 | //!
|
247 | 251 | //! ## Querying the variant
|
248 | 252 | //!
|
249 |
| -//! The [`is_ok`] and [`is_err`] methods return [`true`] if the [`Result`] |
250 |
| -//! is [`Ok`] or [`Err`], respectively. |
| 253 | +//! The [`is_ok`] and [`is_err`] methods return [`true`] if the [`Result`] is |
| 254 | +//! [`Ok`] or [`Err`], respectively. |
251 | 255 | //!
|
252 | 256 | //! [`is_err`]: Result::is_err
|
253 | 257 | //! [`is_ok`]: Result::is_ok
|
|
257 | 261 | //! * [`as_ref`] converts from `&Result<T, E>` to `Result<&T, &E>`
|
258 | 262 | //! * [`as_mut`] converts from `&mut Result<T, E>` to `Result<&mut T, &mut E>`
|
259 | 263 | //! * [`as_deref`] converts from `&Result<T, E>` to `Result<&T::Target, &E>`
|
260 |
| -//! * [`as_deref_mut`] converts from `&mut Result<T, E>` to |
261 |
| -//! `Result<&mut T::Target, &mut E>` |
| 264 | +//! * [`as_deref_mut`] converts from `&mut Result<T, E>` to `Result<&mut |
| 265 | +//! T::Target, &mut E>` |
262 | 266 | //!
|
263 | 267 | //! [`as_deref`]: Result::as_deref
|
264 | 268 | //! [`as_deref_mut`]: Result::as_deref_mut
|
|
267 | 271 | //!
|
268 | 272 | //! ## Extracting contained values
|
269 | 273 | //!
|
270 |
| -//! These methods extract the contained value in a [`Result<T, E>`] when it |
271 |
| -//! is the [`Ok`] variant. If the [`Result`] is [`Err`]: |
| 274 | +//! These methods extract the contained value in a [`Result<T, E>`] when it is |
| 275 | +//! the [`Ok`] variant. If the [`Result`] is [`Err`]: |
272 | 276 | //!
|
273 | 277 | //! * [`expect`] panics with a provided custom message
|
274 | 278 | //! * [`unwrap`] panics with a generic message
|
275 | 279 | //! * [`unwrap_or`] returns the provided default value
|
276 |
| -//! * [`unwrap_or_default`] returns the default value of the type `T` |
277 |
| -//! (which must implement the [`Default`] trait) |
278 |
| -//! * [`unwrap_or_else`] returns the result of evaluating the provided |
279 |
| -//! function |
| 280 | +//! * [`unwrap_or_default`] returns the default value of the type `T` (which |
| 281 | +//! must implement the [`Default`] trait) |
| 282 | +//! * [`unwrap_or_else`] returns the result of evaluating the provided function |
280 | 283 | //!
|
281 |
| -//! The panicking methods [`expect`] and [`unwrap`] require `E` to |
282 |
| -//! implement the [`Debug`] trait. |
| 284 | +//! The panicking methods [`expect`] and [`unwrap`] require `E` to implement the |
| 285 | +//! [`Debug`] trait. |
283 | 286 | //!
|
284 | 287 | //! [`Debug`]: crate::fmt::Debug
|
285 | 288 | //! [`expect`]: Result::expect
|
|
288 | 291 | //! [`unwrap_or_default`]: Result::unwrap_or_default
|
289 | 292 | //! [`unwrap_or_else`]: Result::unwrap_or_else
|
290 | 293 | //!
|
291 |
| -//! These methods extract the contained value in a [`Result<T, E>`] when it |
292 |
| -//! is the [`Err`] variant. They require `T` to implement the [`Debug`] |
293 |
| -//! trait. If the [`Result`] is [`Ok`]: |
| 294 | +//! These methods extract the contained value in a [`Result<T, E>`] when it is |
| 295 | +//! the [`Err`] variant. They require `T` to implement the [`Debug`] trait. If |
| 296 | +//! the [`Result`] is [`Ok`]: |
294 | 297 | //!
|
295 | 298 | //! * [`expect_err`] panics with a provided custom message
|
296 | 299 | //! * [`unwrap_err`] panics with a generic message
|
|
305 | 308 | //!
|
306 | 309 | //! * [`err`][Result::err] transforms [`Result<T, E>`] into [`Option<E>`],
|
307 | 310 | //! mapping [`Err(e)`] to [`Some(e)`] and [`Ok(v)`] to [`None`]
|
308 |
| -//! * [`ok`][Result::ok] transforms [`Result<T, E>`] into [`Option<T>`], |
309 |
| -//! mapping [`Ok(v)`] to [`Some(v)`] and [`Err(e)`] to [`None`] |
310 |
| -//! * [`transpose`] transposes a [`Result`] of an [`Option`] into an |
311 |
| -//! [`Option`] of a [`Result`] |
| 311 | +//! * [`ok`][Result::ok] transforms [`Result<T, E>`] into [`Option<T>`], mapping |
| 312 | +//! [`Ok(v)`] to [`Some(v)`] and [`Err(e)`] to [`None`] |
| 313 | +//! * [`transpose`] transposes a [`Result`] of an [`Option`] into an [`Option`] |
| 314 | +//! of a [`Result`] |
312 | 315 | //!
|
313 | 316 | // Do NOT add link reference definitions for `err` or `ok`, because they
|
314 | 317 | // will generate numerous incorrect URLs for `Err` and `Ok` elsewhere, due
|
|
0 commit comments