pub trait StdError: 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, demand: &mut Demand<'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.

Provided Methods§

1.30.0 · source

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

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"),
    }
}
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}");
}
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, demand: &mut Demand<'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 Demand::provide_value and Demand::provide_ref to extract references to member variables from dyn Error trait objects.

Example
#![feature(provide_any)]
#![feature(error_generic_member_access)]
use core::fmt;
use core::any::Demand;

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

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

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

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

impl std::error::Error for SourceError {}

#[derive(Debug)]
struct Error {
    source: SourceError,
    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, demand: &mut Demand<'a>) {
        demand
            .provide_ref::<MyBacktrace>(&self.backtrace)
            .provide_ref::<dyn std::error::Error + 'static>(&self.source);
    }
}

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

    assert!(core::ptr::eq(&error.backtrace, backtrace_ref));
}

Implementations§

source§

impl<'a> dyn Error + 'a

source

pub fn request_ref<T>(&'a self) -> Option<&'a T>where T: 'static + ?Sized,

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

Request a reference of type T as context about this error.

source

pub fn request_value<T>(&'a self) -> Option<T>where T: 'static,

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

Request a value of type T as context about this error.

source§

impl dyn Error + 'static

1.3.0 · source

pub fn is<T>(&self) -> boolwhere 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 + 'static

1.3.0 · source

pub fn is<T>(&self) -> boolwhere 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

pub fn request_ref<T>(&self) -> Option<&T>where T: 'static + ?Sized,

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

Request a reference of type T as context about this error.

source

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

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

Request a value of type T as context about this error.

source§

impl dyn Error + Send + Sync + 'static

1.3.0 · source

pub fn is<T>(&self) -> boolwhere 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

pub fn request_ref<T>(&self) -> Option<&T>where T: 'static + ?Sized,

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

Request a reference of type T as context about this error.

source

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

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

Request a value of type T as context about this error.

source§

impl dyn Error + 'static

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 + Send + Sync + 'static

1.3.0 · source

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

Attempts to downcast the box to a concrete type.

source§

impl dyn Error + Send + 'static

1.3.0 · source

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

Attempts to downcast the box to a concrete type.

source§

impl dyn Error + 'static

1.3.0 · source

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

Attempts to downcast the box to a concrete type.

Trait Implementations§

1.6.0 · source§

impl From<&str> for Box<dyn Error + 'static, Global>

source§

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

Converts a str into a box of dyn Error.

Examples
use std::error::Error;
use std::mem;

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

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

source§

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

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

Examples
use std::error::Error;
use std::mem;

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

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

source§

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

Converts a Cow into a box of dyn Error.

Examples
use std::error::Error;
use std::mem;
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!(mem::size_of::<Box<dyn Error>>() == mem::size_of_val(&a_boxed_error))
1.22.0 · source§

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

source§

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

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

Examples
use std::error::Error;
use std::mem;
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!(
    mem::size_of::<Box<dyn Error + Send + Sync>>() == mem::size_of_val(&a_boxed_error))
source§

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

source§

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

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

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

#[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 == mem::size_of_val(&an_error));
let a_boxed_error = Box::<dyn Error>::from(an_error);
assert!(mem::size_of::<Box<dyn Error>>() == mem::size_of_val(&a_boxed_error))
source§

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

source§

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

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

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

#[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 == mem::size_of_val(&an_error));
let a_boxed_error = Box::<dyn Error + Send + Sync>::from(an_error);
assert!(
    mem::size_of::<Box<dyn Error + Send + Sync>>() == mem::size_of_val(&a_boxed_error))
1.6.0 · source§

impl From<String> for Box<dyn Error + 'static, Global>

source§

fn from(str_err: String) -> Box<dyn Error + 'static, Global>

Converts a String into a box of dyn Error.

Examples
use std::error::Error;
use std::mem;

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

impl From<String> for Box<dyn Error + Send + Sync + 'static, Global>

source§

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

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

Examples
use std::error::Error;
use std::mem;

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

impl Value for dyn Error + 'static

source§

fn record(&self, key: &Field, visitor: &mut dyn Visit)

Visits this value with the given Visitor.
source§

impl Value for dyn Error + Send + 'static

source§

fn record(&self, key: &Field, visitor: &mut dyn Visit)

Visits this value with the given Visitor.
source§

impl Value for dyn Error + Send + Sync + 'static

source§

fn record(&self, key: &Field, visitor: &mut dyn Visit)

Visits this value with the given Visitor.
source§

impl Value for dyn Error + Sync + 'static

source§

fn record(&self, key: &Field, visitor: &mut dyn Visit)

Visits this value with the given Visitor.

Implementors§

source§

impl !Error for &str

§

impl Error for CounterSigningError

§

impl Error for EntryError

§

impl Error for SecurePrimitiveError

source§

impl Error for ActionError

source§

impl Error for CloneIdError

source§

impl Error for HostFnApiError

source§

impl Error for ScheduleError

§

impl Error for TimestampError

source§

impl Error for ZomeError

§

impl Error for SerializedBytesError

1.8.0 · source§

impl Error for Infallible

source§

impl Error for VarError

1.15.0 · source§

impl Error for std::sync::mpsc::RecvTimeoutError

source§

impl Error for std::sync::mpsc::TryRecvError

source§

impl Error for time::ParseError

source§

impl Error for RoundingError

source§

impl Error for HoloHashError

source§

impl Error for BernoulliError

source§

impl Error for WeightedError

source§

impl Error for !

§

impl Error for hdk::prelude::WasmError

§

impl Error for WrongActionError

source§

impl Error for hdk::prelude::holochain_serialized_bytes::serde::de::value::Error

1.57.0 · source§

impl Error for TryReserveError

1.58.0 · source§

impl Error for FromVecWithNulError

1.7.0 · source§

impl Error for IntoStringError

source§

impl Error for NulError

source§

impl Error for FromUtf8Error

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.17.0 · source§

impl Error for FromBytesWithNulError

1.11.0 · source§

impl Error for core::fmt::Error

1.4.0 · source§

impl Error for AddrParseError

source§

impl Error for ParseFloatError

source§

impl Error for ParseIntError

1.34.0 · source§

impl Error for TryFromIntError

source§

impl Error for ParseBoolError

source§

impl Error for Utf8Error

1.66.0 · source§

impl Error for TryFromFloatSecsError

source§

impl Error for JoinPathsError

1.56.0 · source§

impl Error for WriterPanicked

source§

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

1.7.0 · source§

impl Error for StripPrefixError

source§

impl Error for ExitStatusError

source§

impl Error for std::sync::mpsc::RecvError

1.26.0 · source§

impl Error for AccessError

1.8.0 · source§

impl Error for SystemTimeError

source§

impl Error for OutOfRangeError

source§

impl Error for chrono::format::ParseError

source§

impl Error for ParseWeekdayError

source§

impl Error for getrandom::error::Error

source§

impl Error for serde_json::error::Error

source§

impl Error for SetGlobalDefaultError

source§

impl Error for ParseLevelError

source§

impl Error for ParseLevelFilterError

source§

impl Error for ReadError

source§

impl Error for rand_core::error::Error

§

impl Error for Aborted

§

impl Error for AllocScratchError

§

impl Error for AsStringError

§

impl Error for BinaryReaderError

§

impl Error for BufferSerializerError

§

impl Error for BytesReadError

§

impl Error for Canceled

§

impl Error for CodegenError

§

impl Error for CompileError

§

impl Error for ConvertError

§

impl Error for DataValueCastFailure

§

impl Error for DecodeError

§

impl Error for DeserializeError

§

impl Error for EnterError

§

impl Error for Error

§

impl Error for Error

§

impl Error for Error

§

impl Error for Error

§

impl Error for Error

§

impl Error for Error

§

impl Error for Error

§

impl Error for Error

§

impl Error for ExportError

§

impl Error for FixedSizeScratchError

§

impl Error for GetTimezoneError

§

impl Error for GlobalError

§

impl Error for GossipError

§

impl Error for HostEnvInitError

§

impl Error for ImportError

§

impl Error for InstantiationError

§

impl Error for InstantiationError

§

impl Error for LinkError

§

impl Error for LockError

§

impl Error for LookupError

§

impl Error for MemoryError

§

impl Error for MiddlewareError

§

impl Error for NumValueReadError<Error>

§

impl Error for OffsetError

§

impl Error for PageCountOutOfRange

§

impl Error for ParseCpuFeatureError

§

impl Error for PreInstantiationError

§

impl Error for RecvError

§

impl Error for RecvTimeoutError

§

impl Error for RegisterMappingError

§

impl Error for RuntimeError

§

impl Error for SelectTimeoutError

§

impl Error for SendError

§

impl Error for SerializeError

§

impl Error for SetError

§

impl Error for SharedDeserializeMapError

§

impl Error for SharedSerializeMapError

§

impl Error for SpawnError

§

impl Error for StatsError

§

impl Error for ThreadPoolBuildError

§

impl Error for TrapCode

§

impl Error for TryRecvError

§

impl Error for TryRecvError

§

impl Error for TrySelectError

§

impl Error for UnixTimestampError

§

impl Error for ValueReadError<Error>

§

impl Error for VerifierError

§

impl Error for VerifierErrors

§

impl Error for WasmError

§

impl<'a, E> Error for DecodeStringError<'a, E>where E: RmpReadErr,

source§

impl<'a, K, V> Error for alloc::collections::btree::map::entry::OccupiedError<'a, K, V, Global>where K: Debug + Ord, V: Debug,

source§

impl<'a, K, V> Error for std::collections::hash::map::OccupiedError<'a, K, V>where K: Debug, V: Debug,

1.51.0 · source§

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

§

impl<E> Error for ValueWriteError<E>where E: RmpWriteErr,

source§

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

Either implements Error if both L and R implement it.

§

impl<S, C, H> Error for CompositeSerializerError<S, C, H>where S: Error + 'static, C: Error + 'static, H: Error + 'static,

source§

impl<T> Error for std::sync::mpsc::TrySendError<T>where T: Send,

source§

impl<T> Error for TryLockError<T>

1.8.0 · source§

impl<T> Error for Box<T, Global>where T: Error,

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,

source§

impl<T> Error for std::sync::mpsc::SendError<T>where T: Send,

source§

impl<T> Error for PoisonError<T>

§

impl<T> Error for ReuniteError<T>where T: Any,

§

impl<T> Error for SendError<T>where T: Send,

§

impl<T> Error for SendTimeoutError<T>where T: Send,

§

impl<T> Error for TrySendError<T>where T: Any,

§

impl<T> Error for TrySendError<T>where T: Send,

§

impl<T, E> Error for TryChunksError<T, E>where E: Debug + Display,

§

impl<T, Item> Error for ReuniteError<T, Item>where T: Any,

source§

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

source§

impl<const N: usize> Error for GetManyMutError<N>