Struct Error
struct Error { ... }
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 crate::Error
fn new<E>(error: E) -> Self where E: StdError + Send + Sync + 'staticCreate 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 + 'staticCreate 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 context<C>(self: Self, context: C) -> Self where C: Display + Send + Sync + 'staticWrap 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: &Self) -> &std::backtrace::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: &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: &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: &Self) -> bool where E: Display + Debug + Send + Sync + 'staticReturns 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: Self) -> Result<E, Self> where E: Display + Debug + Send + Sync + 'staticAttempt to downcast the error object to a concrete type.
fn downcast_ref<E>(self: &Self) -> Option<&E> where E: Display + Debug + Send + Sync + 'staticDowncast 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>(self: &mut Self) -> Option<&mut E> where E: Display + Debug + Send + Sync + 'staticDowncast this error object by mutable reference.
impl AsRef for crate::Error
fn as_ref(self: &Self) -> &dyn StdError + Send + Sync + 'static
impl AsRef for crate::Error
fn as_ref(self: &Self) -> &dyn StdError + 'static
impl Debug for crate::Error
fn fmt(self: &Self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result
impl Deref for crate::Error
fn deref(self: &Self) -> &<Self as >::Target
impl DerefMut for crate::Error
fn deref_mut(self: &mut Self) -> &mut <Self as >::Target
impl Display for crate::Error
fn fmt(self: &Self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result
impl Drop for crate::Error
fn drop(self: &mut Self)
impl Freeze for Error
impl RefUnwindSafe for crate::Error
impl Send for Error
impl Sync for Error
impl Unpin for Error
impl UnwindSafe for crate::Error
impl<E> From for crate::Error
fn from(error: E) -> Self
impl<P, T> Receiver for Error
impl<T> Any for Error
fn type_id(self: &Self) -> TypeId
impl<T> Borrow for Error
fn borrow(self: &Self) -> &T
impl<T> BorrowMut for Error
fn borrow_mut(self: &mut Self) -> &mut T
impl<T> From for Error
fn from(t: never) -> T
impl<T> From for Error
fn from(t: T) -> TReturns the argument unchanged.
impl<T> ToString for Error
fn to_string(self: &Self) -> String
impl<T, U> Into for Error
fn into(self: Self) -> UCalls
U::from(self).That is, this conversion is whatever the implementation of
[From]<T> for Uchooses to do.
impl<T, U> TryFrom for Error
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
impl<T, U> TryInto for Error
fn try_into(self: Self) -> Result<U, <U as TryFrom<T>>::Error>