Trait ErrorTrait

1.0.0 · Source
pub trait ErrorTrait: Debug + Display {
    // Provided methods
    fn source(&self) -> Option<&(dyn Error + 'static)> { ... }
    fn description(&self) -> &str { ... }
    fn cause(&self) -> Option<&dyn Error> { ... }
    fn provide<'a>(&'a self, request: &mut Request<'a>) { ... }
}
Expand description

Error is a trait representing the basic expectations for error values, i.e., values of type E in Result<T, E>.

Errors must describe themselves through the Display and Debug traits. Error messages are typically concise lowercase sentences without trailing punctuation:

let err = "NaN".parse::<u32>().unwrap_err();
assert_eq!(err.to_string(), "invalid digit found in string");

Errors may provide cause information. Error::source() is generally used when errors cross “abstraction boundaries”. If one module must report an error that is caused by an error from a lower-level module, it can allow accessing that error via Error::source(). This makes it possible for the high-level module to provide its own errors while also revealing some of the implementation for debugging.

§Example

Implementing the Error trait only requires that Debug and Display are implemented too.

use std::error::Error;
use std::fmt;
use std::path::PathBuf;

#[derive(Debug)]
struct ReadConfigError {
    path: PathBuf
}

impl fmt::Display for ReadConfigError {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        let path = self.path.display();
        write!(f, "unable to read configuration at {path}")
    }
}

impl Error for ReadConfigError {}

Provided Methods§

1.30.0 · Source

fn source(&self) -> Option<&(dyn Error + 'static)>

Returns the lower-level source of this error, if any.

§Examples
use std::error::Error;
use std::fmt;

#[derive(Debug)]
struct SuperError {
    source: SuperErrorSideKick,
}

impl fmt::Display for SuperError {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "SuperError is here!")
    }
}

impl Error for SuperError {
    fn source(&self) -> Option<&(dyn Error + 'static)> {
        Some(&self.source)
    }
}

#[derive(Debug)]
struct SuperErrorSideKick;

impl fmt::Display for SuperErrorSideKick {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "SuperErrorSideKick is here!")
    }
}

impl Error for SuperErrorSideKick {}

fn get_super_error() -> Result<(), SuperError> {
    Err(SuperError { source: SuperErrorSideKick })
}

fn main() {
    match get_super_error() {
        Err(e) => {
            println!("Error: {e}");
            println!("Caused by: {}", e.source().unwrap());
        }
        _ => println!("No error"),
    }
}
1.0.0 · Source

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
if let Err(e) = "xc".parse::<u32>() {
    // Print `e` itself, no need for description().
    eprintln!("Error: {e}");
}
1.0.0 · Source

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
Source

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)

Provides type-based access to context intended for error reports.

Used in conjunction with Request::provide_value and Request::provide_ref to extract references to member variables from dyn Error trait objects.

§Example
#![feature(error_generic_member_access)]
use core::fmt;
use core::error::{request_ref, Request};

#[derive(Debug)]
enum MyLittleTeaPot {
    Empty,
}

#[derive(Debug)]
struct MyBacktrace {
    // ...
}

impl MyBacktrace {
    fn new() -> MyBacktrace {
        // ...
    }
}

#[derive(Debug)]
struct Error {
    backtrace: MyBacktrace,
}

impl fmt::Display for Error {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "Example Error")
    }
}

impl std::error::Error for Error {
    fn provide<'a>(&'a self, request: &mut Request<'a>) {
        request
            .provide_ref::<MyBacktrace>(&self.backtrace);
    }
}

fn main() {
    let backtrace = MyBacktrace::new();
    let error = Error { backtrace };
    let dyn_error = &error as &dyn std::error::Error;
    let backtrace_ref = request_ref::<MyBacktrace>(dyn_error).unwrap();

    assert!(core::ptr::eq(&error.backtrace, backtrace_ref));
    assert!(request_ref::<MyLittleTeaPot>(dyn_error).is_none());
}

Implementations§

Source§

impl dyn Error

1.3.0 · Source

pub fn is<T>(&self) -> bool
where T: Error + 'static,

Returns true if the inner type is the same as T.

1.3.0 · Source

pub fn downcast_ref<T>(&self) -> Option<&T>
where T: Error + 'static,

Returns some reference to the inner value if it is of type T, or None if it isn’t.

1.3.0 · Source

pub fn downcast_mut<T>(&mut self) -> Option<&mut T>
where T: Error + 'static,

Returns some mutable reference to the inner value if it is of type T, or None if it isn’t.

Source§

impl dyn Error + Send

1.3.0 · Source

pub fn is<T>(&self) -> bool
where T: Error + 'static,

Forwards to the method defined on the type dyn Error.

1.3.0 · Source

pub fn downcast_ref<T>(&self) -> Option<&T>
where T: Error + 'static,

Forwards to the method defined on the type dyn Error.

1.3.0 · Source

pub fn downcast_mut<T>(&mut self) -> Option<&mut T>
where T: Error + 'static,

Forwards to the method defined on the type dyn Error.

Source§

impl dyn Error + Send + Sync

1.3.0 · Source

pub fn is<T>(&self) -> bool
where T: Error + 'static,

Forwards to the method defined on the type dyn Error.

1.3.0 · Source

pub fn downcast_ref<T>(&self) -> Option<&T>
where T: Error + 'static,

Forwards to the method defined on the type dyn Error.

1.3.0 · Source

pub fn downcast_mut<T>(&mut self) -> Option<&mut T>
where T: Error + 'static,

Forwards to the method defined on the type dyn Error.

Source§

impl dyn Error

Source

pub fn sources(&self) -> Source<'_>

🔬This is a nightly-only experimental API. (error_iter)

Returns an iterator starting with the current error and continuing with recursively calling Error::source.

If you want to omit the current error and only use its sources, use skip(1).

§Examples
#![feature(error_iter)]
use std::error::Error;
use std::fmt;

#[derive(Debug)]
struct A;

#[derive(Debug)]
struct B(Option<Box<dyn Error + 'static>>);

impl fmt::Display for A {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "A")
    }
}

impl fmt::Display for B {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "B")
    }
}

impl Error for A {}

impl Error for B {
    fn source(&self) -> Option<&(dyn Error + 'static)> {
        self.0.as_ref().map(|e| e.as_ref())
    }
}

let b = B(Some(Box::new(A)));

// let err : Box<Error> = b.into(); // or
let err = &b as &dyn Error;

let mut iter = err.sources();

assert_eq!("B".to_string(), iter.next().unwrap().to_string());
assert_eq!("A".to_string(), iter.next().unwrap().to_string());
assert!(iter.next().is_none());
assert!(iter.next().is_none());
Source§

impl dyn Error

1.3.0 · Source

pub fn downcast<T>(self: Box<dyn Error>) -> Result<Box<T>, Box<dyn Error>>
where T: Error + 'static,

Attempts to downcast the box to a concrete type.

Source§

impl dyn Error + Send

1.3.0 · Source

pub fn downcast<T>( self: Box<dyn Error + Send>, ) -> Result<Box<T>, Box<dyn Error + Send>>
where T: Error + 'static,

Attempts to downcast the box to a concrete type.

Source§

impl dyn Error + Send + Sync

1.3.0 · Source

pub fn downcast<T>( self: Box<dyn Error + Send + Sync>, ) -> Result<Box<T>, Box<dyn Error + Send + Sync>>
where T: Error + 'static,

Attempts to downcast the box to a concrete type.

Trait Implementations§

Source§

impl AsRef<dyn Error> for Error

Source§

fn as_ref(&self) -> &(dyn Error + 'static)

Converts this type into a shared reference of the (usually inferred) input type.
Source§

impl AsRef<dyn Error + Send + Sync> for Error

Source§

fn as_ref(&self) -> &(dyn Error + Send + Sync + 'static)

Converts this type into a shared reference of the (usually inferred) input type.
1.6.0 · Source§

impl<'a> From<&str> for Box<dyn Error + 'a>

Source§

fn from(err: &str) -> Box<dyn Error + 'a>

Converts a str into a box of dyn Error.

§Examples
use std::error::Error;

let a_str_error = "a str error";
let a_boxed_error = Box::<dyn Error>::from(a_str_error);
assert!(size_of::<Box<dyn Error>>() == size_of_val(&a_boxed_error))
1.0.0 · Source§

impl<'a> From<&str> for Box<dyn Error + Send + Sync + 'a>

Source§

fn from(err: &str) -> Box<dyn Error + Send + Sync + 'a>

Converts a str into a box of dyn Error + Send + Sync.

§Examples
use std::error::Error;

let a_str_error = "a str error";
let a_boxed_error = Box::<dyn Error + Send + Sync>::from(a_str_error);
assert!(
    size_of::<Box<dyn Error + Send + Sync>>() == size_of_val(&a_boxed_error))
Source§

impl From<ColoredString> for Box<dyn Error>

Source§

fn from(cs: ColoredString) -> Box<dyn Error>

Converts to this type from the input type.
1.22.0 · Source§

impl<'a, 'b> From<Cow<'b, str>> for Box<dyn Error + 'a>

Source§

fn from(err: Cow<'b, str>) -> Box<dyn Error + 'a>

Converts a Cow into a box of dyn Error.

§Examples
use std::error::Error;
use std::borrow::Cow;

let a_cow_str_error = Cow::from("a str error");
let a_boxed_error = Box::<dyn Error>::from(a_cow_str_error);
assert!(size_of::<Box<dyn Error>>() == size_of_val(&a_boxed_error))
1.22.0 · Source§

impl<'a, 'b> From<Cow<'b, str>> for Box<dyn Error + Send + Sync + 'a>

Source§

fn from(err: Cow<'b, str>) -> Box<dyn Error + Send + Sync + 'a>

Converts a Cow into a box of dyn Error + Send + Sync.

§Examples
use std::error::Error;
use std::borrow::Cow;

let a_cow_str_error = Cow::from("a str error");
let a_boxed_error = Box::<dyn Error + Send + Sync>::from(a_cow_str_error);
assert!(
    size_of::<Box<dyn Error + Send + Sync>>() == size_of_val(&a_boxed_error))
1.0.0 · Source§

impl<'a, E> From<E> for Box<dyn Error + 'a>
where E: Error + 'a,

Source§

fn from(err: E) -> Box<dyn Error + 'a>

Converts a type of Error into a box of dyn Error.

§Examples
use std::error::Error;
use std::fmt;

#[derive(Debug)]
struct AnError;

impl fmt::Display for AnError {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "An error")
    }
}

impl Error for AnError {}

let an_error = AnError;
assert!(0 == size_of_val(&an_error));
let a_boxed_error = Box::<dyn Error>::from(an_error);
assert!(size_of::<Box<dyn Error>>() == size_of_val(&a_boxed_error))
1.0.0 · Source§

impl<'a, E> From<E> for Box<dyn Error + Send + Sync + 'a>
where E: Error + Send + Sync + 'a,

Source§

fn from(err: E) -> Box<dyn Error + Send + Sync + 'a>

Converts a type of Error + Send + Sync into a box of dyn Error + Send + Sync.

§Examples
use std::error::Error;
use std::fmt;

#[derive(Debug)]
struct AnError;

impl fmt::Display for AnError {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "An error")
    }
}

impl Error for AnError {}

unsafe impl Send for AnError {}

unsafe impl Sync for AnError {}

let an_error = AnError;
assert!(0 == size_of_val(&an_error));
let a_boxed_error = Box::<dyn Error + Send + Sync>::from(an_error);
assert!(
    size_of::<Box<dyn Error + Send + Sync>>() == size_of_val(&a_boxed_error))
Source§

impl From<Error> for Box<dyn Error>

Source§

fn from(error: Error) -> Box<dyn Error>

Converts to this type from the input type.
Source§

impl From<Error> for Box<dyn Error + Send>

Source§

fn from(error: Error) -> Box<dyn Error + Send>

Converts to this type from the input type.
Source§

impl From<Error> for Box<dyn Error + Send + Sync>

Source§

fn from(error: Error) -> Box<dyn Error + Send + Sync>

Converts to this type from the input type.
1.6.0 · Source§

impl<'a> From<String> for Box<dyn Error + 'a>

Source§

fn from(str_err: String) -> Box<dyn Error + 'a>

Converts a String into a box of dyn Error.

§Examples
use std::error::Error;

let a_string_error = "a string error".to_string();
let a_boxed_error = Box::<dyn Error>::from(a_string_error);
assert!(size_of::<Box<dyn Error>>() == size_of_val(&a_boxed_error))
1.0.0 · Source§

impl<'a> From<String> for Box<dyn Error + Send + Sync + 'a>

Source§

fn from(err: String) -> Box<dyn Error + Send + Sync + 'a>

Converts a String into a box of dyn Error + Send + Sync.

§Examples
use std::error::Error;

let a_string_error = "a string error".to_string();
let a_boxed_error = Box::<dyn Error + Send + Sync>::from(a_string_error);
assert!(
    size_of::<Box<dyn Error + Send + Sync>>() == size_of_val(&a_boxed_error))

Implementors§

1.65.0 · Source§

impl !Error for &str

Source§

impl Error for CrateDocError

Source§

impl Error for MainHeaderRenewError

Source§

impl Error for ModulesHeadersRenewError

Source§

impl Error for ManifestError

Source§

impl Error for PathError

Source§

impl Error for WorkspaceInitError

Source§

impl Error for PackageError

1.8.0 · Source§

impl Error for Infallible

1.17.0 · Source§

impl Error for FromBytesWithNulError

1.86.0 · Source§

impl Error for GetDisjointMutError

1.0.0 · Source§

impl Error for VarError

1.89.0 · Source§

impl Error for std::fs::TryLockError

1.15.0 · Source§

impl Error for RecvTimeoutError

1.0.0 · Source§

impl Error for TryRecvError

Source§

impl Error for ParseAlphabetError

Source§

impl Error for DecodeError

Source§

impl Error for DecodeSliceError

Source§

impl Error for EncodeSliceError

Source§

impl Error for cargo_metadata::errors::Error

Source§

impl Error for StringStreamError

Source§

impl Error for UnexpectedParse

Source§

impl Error for BinaryError

Source§

impl Error for CodepointError

Source§

impl Error for FromStrError

Source§

impl Error for Utf16ArrayError

Source§

impl Error for Utf16PairError

Source§

impl Error for Utf16SliceError

Source§

impl Error for Utf16TupleError

Source§

impl Error for ignore::Error

Source§

impl Error for StartError

Source§

impl Error for regex_syntax::error::Error

Source§

impl Error for regex::error::Error

Source§

impl Error for rustls_pki_types::pem::Error

Source§

impl Error for webpki::error::Error

Source§

impl Error for rustls::error::Error

Source§

impl Error for VerifierBuilderError

Source§

impl Error for strum::ParseError

Source§

impl Error for term::Error

Source§

impl Error for term::terminfo::Error

Source§

impl Error for term::terminfo::parm::Error

Source§

impl Error for ucd_trie::owned::Error

Source§

impl Error for ureq::error::Error

Source§

impl Error for url::parser::ParseError

Source§

impl Error for wca::ca::aggregator::private::Error

Source§

impl Error for ValidationError

Source§

impl Error for ParserError

Source§

impl Error for VerificationError

Source§

impl Error for !

Source§

impl Error for NormalizeError

1.7.0 · Source§

impl Error for StripPrefixError

Source§

impl Error for willbe::proc_macro2::LexError

Source§

impl Error for willbe::syn::Error

Source§

impl Error for UnorderedKeyError

1.57.0 · Source§

impl Error for alloc::collections::TryReserveError

1.58.0 · Source§

impl Error for FromVecWithNulError

1.7.0 · Source§

impl Error for IntoStringError

1.0.0 · Source§

impl Error for NulError

1.0.0 · Source§

impl Error for alloc::string::FromUtf8Error

1.0.0 · Source§

impl Error for FromUtf16Error

1.28.0 · Source§

impl Error for LayoutError

Source§

impl Error for AllocError

1.34.0 · Source§

impl Error for TryFromSliceError

1.13.0 · Source§

impl Error for BorrowError

1.13.0 · Source§

impl Error for BorrowMutError

1.34.0 · Source§

impl Error for CharTryFromError

1.20.0 · Source§

impl Error for ParseCharError

1.9.0 · Source§

impl Error for DecodeUtf16Error

1.59.0 · Source§

impl Error for TryFromCharError

1.69.0 · Source§

impl Error for FromBytesUntilNulError

1.11.0 · Source§

impl Error for core::fmt::Error

1.4.0 · Source§

impl Error for core::net::parser::AddrParseError

1.0.0 · Source§

impl Error for ParseFloatError

1.0.0 · Source§

impl Error for ParseIntError

1.34.0 · Source§

impl Error for TryFromIntError

1.0.0 · Source§

impl Error for ParseBoolError

1.0.0 · Source§

impl Error for core::str::error::Utf8Error

1.66.0 · Source§

impl Error for TryFromFloatSecsError

Source§

impl Error for ExpandError

1.44.0 · Source§

impl Error for proc_macro::LexError

1.0.0 · Source§

impl Error for JoinPathsError

1.56.0 · Source§

impl Error for WriterPanicked

1.0.0 · Source§

impl Error for std::io::error::Error

Source§

impl Error for ExitStatusError

1.0.0 · Source§

impl Error for RecvError

1.26.0 · Source§

impl Error for AccessError

1.8.0 · Source§

impl Error for SystemTimeError

Source§

impl Error for aho_corasick::util::error::BuildError

Source§

impl Error for aho_corasick::util::error::MatchError

Source§

impl Error for aho_corasick::util::primitives::PatternIDError

Source§

impl Error for aho_corasick::util::primitives::StateIDError

Source§

impl Error for bitflags::parser::ParseError

Source§

impl Error for bstr::ext_vec::FromUtf8Error

Source§

impl Error for bstr::utf8::Utf8Error

Source§

impl Error for FromPathBufError

Source§

impl Error for FromPathError

Source§

impl Error for cargo_platform::error::ParseError

Source§

impl Error for csv::deserializer::DeserializeError

Source§

impl Error for csv::error::Error

Source§

impl Error for csv::error::FromUtf8Error

Source§

impl Error for csv::error::Utf8Error

Source§

impl Error for WrongVariantError

Source§

impl Error for UnitError

Source§

impl Error for EmptyStrError

Source§

impl Error for NonAsciiError

Source§

impl Error for NonBmpError

Source§

impl Error for encode_unicode::errors::Utf8Error

Source§

impl Error for Utf16FirstUnitError

Source§

impl Error for CompressError

Source§

impl Error for DecompressError

Source§

impl Error for globset::Error

Source§

impl Error for GlobError

Source§

impl Error for RenderError

Source§

impl Error for handlebars::error::TemplateError

Source§

impl Error for idna::uts46::Errors

Source§

impl Error for indexmap::TryReserveError

Source§

impl Error for indicatif::style::TemplateError

Source§

impl Error for parse_display::ParseError

Source§

impl Error for parse_display::ParseError

Source§

impl Error for ThreadPoolBuildError

Source§

impl Error for regex_automata::dfa::onepass::BuildError

Source§

impl Error for regex_automata::hybrid::error::BuildError

Source§

impl Error for CacheError

Source§

impl Error for regex_automata::meta::error::BuildError

Source§

impl Error for regex_automata::nfa::thompson::error::BuildError

Source§

impl Error for GroupInfoError

Source§

impl Error for UnicodeWordBoundaryError

Source§

impl Error for regex_automata::util::primitives::PatternIDError

Source§

impl Error for SmallIndexError

Source§

impl Error for regex_automata::util::primitives::StateIDError

Source§

impl Error for regex_automata::util::search::MatchError

Source§

impl Error for PatternSetInsertError

Source§

impl Error for regex_automata::util::wire::DeserializeError

Source§

impl Error for SerializeError

Source§

impl Error for regex_syntax::ast::Error

Source§

impl Error for regex_syntax::hir::Error

Source§

impl Error for CaseFoldError

Source§

impl Error for UnicodeWordError

Source§

impl Error for Errno

Source§

impl Error for rustls_pki_types::server_name::AddrParseError

Source§

impl Error for InvalidDnsNameError

Source§

impl Error for UnsupportedOperationError

Source§

impl Error for OtherError

Source§

impl Error for semver::parse::Error

Source§

impl Error for serde::de::value::Error

Source§

impl Error for serde_json::error::Error

Source§

impl Error for TomlError

Source§

impl Error for Transport

Source§

impl Error for walkdir::error::Error

Source§

impl Error for UnsupportedPlatformError

Source§

impl<'a, K, V> Error for willbe::tool::btree_map::OccupiedError<'a, K, V>
where K: Debug + Ord, V: Debug,

Source§

impl<'a, K, V> Error for willbe::tool::hash_map::OccupiedError<'a, K, V>
where K: Debug, V: Debug,

1.51.0 · Source§

impl<'a, T> Error for &'a T
where T: Error + ?Sized,

1.8.0 · Source§

impl<E> Error for Box<E>
where E: Error,

Source§

impl<E, P> Error for combine::stream::decoder::Error<E, P>
where E: Error, P: Display + Debug,

Source§

impl<I> Error for willbe::iter::iter_tools::dependency::itertools::ExactlyOneError<I>
where I: Iterator + Debug, <I as Iterator>::Item: Debug,

Source§

impl<I> Error for itertools::exactly_one_err::ExactlyOneError<I>
where I: Iterator + Debug, <I as Iterator>::Item: Debug,

Source§

impl<L, R> Error for Either<L, R>
where L: Error, R: Error,

Either implements Error if both L and R implement it.

Source§

impl<R> Error for ErrorVariant<R>

Source§

impl<R> Error for pest::error::Error<R>
where Error<R>: Debug + Display,

Source§

impl<T> Error for SendTimeoutError<T>

1.0.0 · Source§

impl<T> Error for TrySendError<T>

1.0.0 · Source§

impl<T> Error for std::sync::poison::TryLockError<T>

Source§

impl<T> Error for ThinBox<T>
where T: Error + ?Sized,

1.52.0 · Source§

impl<T> Error for Arc<T>
where T: Error + ?Sized,

1.0.0 · Source§

impl<T> Error for SendError<T>

1.0.0 · Source§

impl<T> Error for PoisonError<T>

Source§

impl<T> Error for TryIntoError<T>
where T: Debug,

Source§

impl<T, R, P> Error for combine::stream::easy::Errors<T, R, P>
where P: Display + Debug, T: Display + Debug, R: Display + Debug,

1.0.0 · Source§

impl<W> Error for std::io::buffered::IntoInnerError<W>
where W: Send + Debug,

Source§

impl<W> Error for csv::error::IntoInnerError<W>
where W: Any,