Struct Error
#[repr(transparent)]
pub struct Error { /* private fields */ }
The Error type, a wrapper around a dynamic error type.
Error works a lot like Box<dyn std::error::Error>, but with these
differences:
Errorrequires that the error isSend,Sync, and'static.Errorguarantees that a backtrace is available, even if the underlying error type does not provide one.Erroris represented as a narrow pointer — exactly one word in size instead of two.
Display representations
When you print an error object using "{}" or to_string(), only the outermost underlying error or context is printed, not any of the lower level causes. This is exactly as if you had called the Display impl of the error from which you constructed your anyhow::Error.
Failed to read instrs from ./path/to/instrs.json
To print causes as well using anyhow's default formatting of causes, use the alternate selector "{:#}".
Failed to read instrs from ./path/to/instrs.json: No such file or directory (os error 2)
The Debug format "{:?}" includes your backtrace if one was captured. Note
that this is the representation you get by default if you return an error
from fn main instead of printing it explicitly yourself.
Error: Failed to read instrs from ./path/to/instrs.json
Caused by:
No such file or directory (os error 2)
and if there is a backtrace available:
Error: Failed to read instrs from ./path/to/instrs.json
Caused by:
No such file or directory (os error 2)
Stack backtrace:
0: <E as anyhow::context::ext::StdError>::ext_context
at /git/anyhow/src/backtrace.rs:26
1: core::result::Result<T,E>::map_err
at /git/rustc/src/libcore/result.rs:596
2: anyhow::context::<impl anyhow::Context<T,E> for core::result::Result<T,E>>::with_context
at /git/anyhow/src/context.rs:58
3: testing::main
at src/main.rs:5
4: std::rt::lang_start
at /git/rustc/src/libstd/rt.rs:61
5: main
6: __libc_start_main
7: _start
To see a conventional struct-style Debug representation, use "{:#?}".
Error {
context: "Failed to read instrs from ./path/to/instrs.json",
source: Os {
code: 2,
kind: NotFound,
message: "No such file or directory",
},
}
If none of the built-in representations are appropriate and you would prefer to render the error and its cause chain yourself, it can be done something like this:
use ;
Implementations
impl Error
fn new<E>(error: E) -> Self where E: StdError + Send + Sync + 'static,Create a new error object from any error type.
The error type must be threadsafe and
'static, so that theErrorwill be as well.If the error type does not provide a backtrace, a backtrace will be created here to ensure that a backtrace exists.
fn msg<M>(message: M) -> Self where M: Display + Debug + Send + Sync + 'static,Create a new error object from a printable error message.
If the argument implements std::error::Error, prefer
Error::newinstead which preserves the underlying error's cause chain and backtrace. If the argument may or may not implement std::error::Error now or in the future, useanyhow!(err)which handles either way correctly.Error::msg("...")is equivalent toanyhow!("...")but occasionally convenient in places where a function is preferable over a macro, such as iterator or stream combinators:# # # use ; # use ; use ; asyncfn from_boxed(boxed_error: Box<dyn StdError + Send + Sync + 'static>) -> SelfConstruct an error object from a type-erased standard library error.
This is mostly useful for interop with other error libraries.
Example
Here is a skeleton of a library that provides its own error abstraction. The pair of
Fromimpls provide bidirectional support for?conversion betweenReportandanyhow::Error.use Error as StdError; // Example usage: can use `?` in both directions.fn context<C>(self, context: C) -> Self where C: Display + Send + Sync + 'static,Wrap the error value with additional context.
For attaching context to a
Resultas it is propagated, the [Context][crate::Context] extension trait may be more convenient than this function.The primary reason to use
error.context(...)instead ofresult.context(...)via theContexttrait would be if the context needs to depend on some data held by the underlying error:# use ; # # type T = ; # # # # # use Result; use File; use Path;fn backtrace(&self) -> &BacktraceGet the backtrace for this Error.
In order for the backtrace to be meaningful, one of the two environment variables
RUST_LIB_BACKTRACE=1orRUST_BACKTRACE=1must be defined andRUST_LIB_BACKTRACEmust not be0. Backtraces are somewhat expensive to capture in Rust, so we don't necessarily want to be capturing them all over the place all the time.- If you want panics and errors to both have backtraces, set
RUST_BACKTRACE=1; - If you want only errors to have backtraces, set
RUST_LIB_BACKTRACE=1; - If you want only panics to have backtraces, set
RUST_BACKTRACE=1andRUST_LIB_BACKTRACE=0.
Stability
Standard library backtraces are only available when using Rust ≥ 1.65. On older compilers, this function is only available if the crate's "backtrace" feature is enabled, and will use the
backtracecrate as the underlying backtrace implementation. The return type of this function on old compilers is&(impl Debug + Display).[dependencies] anyhow = { version = "1.0", features = ["backtrace"] }- If you want panics and errors to both have backtraces, set
fn chain(&self) -> Chain<'_>An iterator of the chain of source errors contained by this Error.
This iterator will visit every error in the cause chain of this error object, beginning with the error that this error object was created from.
Example
use Error; use io;fn root_cause(&self) -> &dyn StdError + 'staticThe lowest level cause of this error — this error's cause's cause's cause etc.
The root cause is the last error in the iterator produced by [
chain()][Error::chain].fn is<E>(&self) -> bool where E: Display + Debug + Send + Sync + 'static,Returns true if
Eis the type held by this error object.For errors with context, this method returns true if
Ematches the type of the contextCor the type of the error on which the context has been attached. For details about the interaction between context and downcasting, see here.fn downcast<E>(self) -> Result<E, Self> where E: Display + Debug + Send + Sync + 'static,Attempt to downcast the error object to a concrete type.
fn downcast_ref<E>(&self) -> Option<&E> where E: Display + Debug + Send + Sync + 'static,Downcast this error object by reference.
Example
# use anyhow; # use ; # use Poll; # # # # # # # # # const REDACTED_CONTENT: = ; # # let error = anyhow!; # let root_cause = &error; # # let ret = // If the error was caused by redaction, then return a tombstone instead // of the content. match root_cause. # ;fn downcast_mut<E>(&mut self) -> Option<&mut E> where E: Display + Debug + Send + Sync + 'static,Downcast this error object by mutable reference.
fn into_boxed_dyn_error(self) -> Box<dyn StdError + Send + Sync + 'static>Convert to a standard library error trait object.
This is implemented as a cheap pointer cast that does not allocate or deallocate memory. Like
anyhow::Error::from_boxed, it's useful for interop with other error libraries.The same conversion is also available as
impl From<anyhow::Error> for Box<dyn Error + Send + Sync + 'static>.If a backtrace was collected during construction of the
anyhow::Error, that backtrace remains accessible using the standard libraryErrortrait's provider API, but as a consequence, the resulting boxed error can no longer be downcast to its original underlying type.use anyhow; use Backtrace; use Error; ; let anyhow_error = anyhow!; println!; // has Backtrace assert!; // can downcast let boxed_dyn_error = anyhow_error.into_boxed_dyn_error; assert!; // has Backtrace assert!; // can no longer downcastfn reallocate_into_boxed_dyn_error_without_backtrace(self) -> Box<dyn StdError + Send + Sync + 'static>Convert to a standard library error trait object.
Unlike
self.into_boxed_dyn_error(), this method relocates the underlying error into a new allocation in order to make it downcastable to&EorBox<E>for its original underlying error type. Any backtrace collected during construction of theanyhow::Erroris discarded.use anyhow; use Backtrace; use Error; ; let anyhow_error = anyhow!; println!; // has Backtrace assert!; // can downcast let boxed_dyn_error = anyhow_error.reallocate_into_boxed_dyn_error_without_backtrace; assert!; // Backtrace lost assert!; // can downcast to &MyError assert!; // can downcast to Box<MyError>
Trait Implementations
impl AsRef<dyn Error + Sync + Send> for Error
fn as_ref(&self) -> &dyn StdError + Send + Sync + 'static
impl AsRef<dyn Error> for Error
fn as_ref(&self) -> &dyn StdError + 'static
impl Debug for Error
fn fmt(&self, formatter: &mut Formatter<'_>) -> Result
impl Deref for Error
type Target = dyn Error + Sync + Send;fn deref(&self) -> &Self::Target
impl DerefMut for Error
fn deref_mut(&mut self) -> &mut Self::Target
impl Display for Error
fn fmt(&self, formatter: &mut Formatter<'_>) -> Result
impl Drop for Error
fn drop(&mut self)
impl RefUnwindSafe for Error
impl UnwindSafe for Error
impl<E> From<E> for Error
where
E: StdError + Send + Sync + 'static,
fn from(error: E) -> Self
Auto Trait Implementations
impl Freeze for Error
impl Send for Error
impl Sync for Error
impl Unpin for Error
impl UnsafeUnpin for Error
Blanket Implementations
impl<P, T> Receiver for Error
where
P: Deref<Target = T> + ?Sized,
T: ?Sized,
type Target = T;
impl<T> Any for Error
where
T: 'static + ?Sized,
fn type_id(&self) -> TypeId
impl<T> Borrow<T> for Error
where
T: ?Sized,
fn borrow(&self) -> &T
impl<T> BorrowMut<T> for Error
where
T: ?Sized,
fn borrow_mut(&mut self) -> &mut T
impl<T> From<T> for Error
fn from(t: T) -> TReturns the argument unchanged.
impl<T> ToString for Error
where
T: Display + ?Sized,
fn to_string(&self) -> String
impl<T, U> Into<U> for Error
where
U: From<T>,
fn into(self) -> UCalls
U::from(self).That is, this conversion is whatever the implementation of
[From]<T> for Uchooses to do.
impl<T, U> TryFrom<U> for Error
where
U: Into<T>,
type Error = never;fn try_from(value: U) -> Result<T, never>
impl<T, U> TryInto<U> for Error
where
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error;fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>