#[non_exhaustive]pub enum RetryError<E> {
Exhausted {
attempts: u32,
last_error: E,
},
}Expand description
The error returned when a retried operation does not succeed.
It carries how many attempts were made and the last error the operation
produced. There is intentionally no E: core::error::Error bound and no
allocation: the failing value is moved in by value.
#[non_exhaustive]: new variants may be added in a future release, so match
with a wildcard arm.
Variants (Non-exhaustive)§
This enum is marked as non-exhaustive
Exhausted
No further attempts will be made. This covers both running out of the
allowed attempts and the retry predicate declining to retry: in either
case attempts is the number of attempts actually made and last_error
is the error from the final attempt.
Implementations§
Source§impl<E> RetryError<E>
impl<E> RetryError<E>
Sourcepub fn attempts(&self) -> u32
pub fn attempts(&self) -> u32
The number of attempts that were made.
Examples found in repository?
17fn main() {
18 let policy = RetryPolicy::new(
19 5,
20 Backoff::exponential(Duration::from_millis(50), 2).with_max_delay(Duration::from_secs(1)),
21 )
22 .expect("max_attempts is non-zero");
23
24 // An operation that fails twice with a temporary error, then succeeds.
25 let mut attempt = 0;
26 let result: Result<&str, RetryError<ApiError>> = retry_with_sleep(
27 &policy,
28 || {
29 attempt += 1;
30 println!("attempt {attempt}");
31 if attempt < 3 {
32 Err(ApiError::Temporary)
33 } else {
34 Ok("payload")
35 }
36 },
37 |error| matches!(error, ApiError::Temporary), // retry only temporary errors
38 |delay| {
39 // You provide the waiting. In real code, call your platform or
40 // runtime sleep here; this example only reports the delay so it
41 // stays dependency-free and instant.
42 println!(" would wait {delay:?} before the next attempt");
43 },
44 );
45 match result {
46 Ok(body) => println!("succeeded with: {body}"),
47 Err(error) => println!("gave up: {error:?}"),
48 }
49
50 // A fatal error stops immediately, even though attempts remain.
51 let mut attempt = 0;
52 let result: Result<&str, RetryError<ApiError>> = retry_with_sleep(
53 &policy,
54 || {
55 attempt += 1;
56 Err(ApiError::Fatal)
57 },
58 |error| matches!(error, ApiError::Temporary),
59 |_delay| {},
60 );
61 println!(
62 "fatal path: stopped after {} attempt(s)",
63 result.unwrap_err().attempts()
64 );
65}Sourcepub fn last_error(&self) -> &E
pub fn last_error(&self) -> &E
A reference to the error returned by the final attempt.
Sourcepub fn into_last_error(self) -> E
pub fn into_last_error(self) -> E
Consumes the error and returns the final attempt’s error.
Trait Implementations§
Source§impl<E: Clone> Clone for RetryError<E>
impl<E: Clone> Clone for RetryError<E>
Source§fn clone(&self) -> RetryError<E>
fn clone(&self) -> RetryError<E>
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreimpl<E: Copy> Copy for RetryError<E>
Source§impl<E: Debug> Debug for RetryError<E>
impl<E: Debug> Debug for RetryError<E>
Source§impl<E: Display> Display for RetryError<E>
impl<E: Display> Display for RetryError<E>
impl<E: Eq> Eq for RetryError<E>
Source§impl<E: Error + 'static> Error for RetryError<E>
Available on crate feature std only.
impl<E: Error + 'static> Error for RetryError<E>
std only.Source§fn source(&self) -> Option<&(dyn Error + 'static)>
fn source(&self) -> Option<&(dyn Error + 'static)>
1.0.0 · Source§fn description(&self) -> &str
fn description(&self) -> &str
use the Display impl or to_string()
Source§impl<E: Hash> Hash for RetryError<E>
impl<E: Hash> Hash for RetryError<E>
Source§impl<E: PartialEq> PartialEq for RetryError<E>
impl<E: PartialEq> PartialEq for RetryError<E>
Source§fn eq(&self, other: &RetryError<E>) -> bool
fn eq(&self, other: &RetryError<E>) -> bool
self and other values to be equal, and is used by ==.