pub trait Error: Debug + Display {
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");
RunErrors 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 · sourcefn source(&self) -> Option<&(dyn Error + 'static)>
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"),
}
}
Runsourcefn description(&self) -> &str
fn description(&self) -> &str
if let Err(e) = "xc".parse::<u32>() {
// Print `e` itself, no need for description().
eprintln!("Error: {e}");
}
Runsourcefn cause(&self) -> Option<&dyn Error>
fn cause(&self) -> Option<&dyn Error>
sourcefn provide<'a>(&'a self, demand: &mut Demand<'a>)
fn provide<'a>(&'a self, demand: &mut Demand<'a>)
error_generic_member_access
#99301)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));
}
RunImplementations
sourceimpl<'a> dyn Error + 'a
impl<'a> dyn Error + 'a
sourcepub fn request_ref<T: ?Sized + 'static>(&'a self) -> Option<&'a T>
🔬This is a nightly-only experimental API. (error_generic_member_access
#99301)
pub fn request_ref<T: ?Sized + 'static>(&'a self) -> Option<&'a T>
error_generic_member_access
#99301)Request a reference of type T
as context about this error.
sourcepub fn request_value<T: 'static>(&'a self) -> Option<T>
🔬This is a nightly-only experimental API. (error_generic_member_access
#99301)
pub fn request_value<T: 'static>(&'a self) -> Option<T>
error_generic_member_access
#99301)Request a value of type T
as context about this error.
sourceimpl dyn Error + 'static
impl dyn Error + 'static
1.3.0 · sourcepub fn is<T: Error + 'static>(&self) -> bool
pub fn is<T: Error + 'static>(&self) -> bool
Returns true
if the inner type is the same as T
.
1.3.0 · sourcepub fn downcast_ref<T: Error + 'static>(&self) -> Option<&T>
pub fn downcast_ref<T: Error + 'static>(&self) -> Option<&T>
Returns some reference to the inner value if it is of type T
, or
None
if it isn’t.
1.3.0 · sourcepub fn downcast_mut<T: Error + 'static>(&mut self) -> Option<&mut T>
pub fn downcast_mut<T: Error + 'static>(&mut self) -> Option<&mut T>
Returns some mutable reference to the inner value if it is of type T
, or
None
if it isn’t.
sourceimpl dyn Error + Send + 'static
impl dyn Error + Send + 'static
1.3.0 · sourcepub fn is<T: Error + 'static>(&self) -> bool
pub fn is<T: Error + 'static>(&self) -> bool
Forwards to the method defined on the type dyn Error
.
1.3.0 · sourcepub fn downcast_ref<T: Error + 'static>(&self) -> Option<&T>
pub fn downcast_ref<T: Error + 'static>(&self) -> Option<&T>
Forwards to the method defined on the type dyn Error
.
1.3.0 · sourcepub fn downcast_mut<T: Error + 'static>(&mut self) -> Option<&mut T>
pub fn downcast_mut<T: Error + 'static>(&mut self) -> Option<&mut T>
Forwards to the method defined on the type dyn Error
.
sourcepub fn request_ref<T: ?Sized + 'static>(&self) -> Option<&T>
🔬This is a nightly-only experimental API. (error_generic_member_access
#99301)
pub fn request_ref<T: ?Sized + 'static>(&self) -> Option<&T>
error_generic_member_access
#99301)Request a reference of type T
as context about this error.
sourcepub fn request_value<T: 'static>(&self) -> Option<T>
🔬This is a nightly-only experimental API. (error_generic_member_access
#99301)
pub fn request_value<T: 'static>(&self) -> Option<T>
error_generic_member_access
#99301)Request a value of type T
as context about this error.
sourceimpl dyn Error + Send + Sync + 'static
impl dyn Error + Send + Sync + 'static
1.3.0 · sourcepub fn is<T: Error + 'static>(&self) -> bool
pub fn is<T: Error + 'static>(&self) -> bool
Forwards to the method defined on the type dyn Error
.
1.3.0 · sourcepub fn downcast_ref<T: Error + 'static>(&self) -> Option<&T>
pub fn downcast_ref<T: Error + 'static>(&self) -> Option<&T>
Forwards to the method defined on the type dyn Error
.
1.3.0 · sourcepub fn downcast_mut<T: Error + 'static>(&mut self) -> Option<&mut T>
pub fn downcast_mut<T: Error + 'static>(&mut self) -> Option<&mut T>
Forwards to the method defined on the type dyn Error
.
sourcepub fn request_ref<T: ?Sized + 'static>(&self) -> Option<&T>
🔬This is a nightly-only experimental API. (error_generic_member_access
#99301)
pub fn request_ref<T: ?Sized + 'static>(&self) -> Option<&T>
error_generic_member_access
#99301)Request a reference of type T
as context about this error.
sourcepub fn request_value<T: 'static>(&self) -> Option<T>
🔬This is a nightly-only experimental API. (error_generic_member_access
#99301)
pub fn request_value<T: 'static>(&self) -> Option<T>
error_generic_member_access
#99301)Request a value of type T
as context about this error.
sourceimpl dyn Error
impl dyn Error
sourcepub fn sources(&self) -> Source<'_>ⓘ
🔬This is a nightly-only experimental API. (error_iter
#58520)
pub fn sources(&self) -> Source<'_>ⓘ
error_iter
#58520)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());
Run