#[macro_use] extern crate failure; use failure::Fail; #[derive(Debug, Fail)] #[fail(display = "my error")] struct MyError; #[derive(Debug, Fail)] #[fail(display = "my wrapping error")] struct WrappingError(#[fail(cause)] MyError); fn bad_function() -> Result<(), WrappingError> { Err(WrappingError(MyError)) } fn main() { for cause in Fail::iter_chain(&bad_function().unwrap_err()) { println!("{}: {}", cause.name().unwrap_or("Error"), cause); } }