Crate Rust Documentation Coverage Status Workflow Status Average time to resolve an issue Percentage of issues still open Maintenance

chainerror

chainerror provides an error backtrace without doing a real backtrace, so even after you strip your binaries, you still have the error backtrace.

Having nested function returning errors, the output doesn't tell where the error originates from.

```rust use std::path::PathBuf;

type BoxedError = Box; fn readconfigfile(path: PathBuf) -> Result<(), BoxedError> { // do stuff, return other errors let buf = std::fs::readto_string(&path)?; // do stuff, return other errors Ok(()) }

fn processconfigfile() -> Result<(), BoxedError> { // do stuff, return other errors let buf = readconfig_file("foo.txt".into())?; // do stuff, return other errors Ok(()) }

fn main() { if let Err(e) = processconfigfile() { eprintln!("Error:\n{:?}", e); } } ```

This gives the output: console Error: Os { code: 2, kind: NotFound, message: "No such file or directory" } and you have no idea where it comes from.

With chainerror, you can supply a context and get a nice error backtrace:

```rust use chainerror::prelude::v1::*; use std::path::PathBuf;

type BoxedError = Box; fn readconfigfile(path: PathBuf) -> Result<(), BoxedError> { // do stuff, return other errors let buf = std::fs::readto_string(&path).context(format!("Reading file: {:?}", &path))?; // do stuff, return other errors Ok(()) }

fn processconfigfile() -> Result<(), BoxedError> { // do stuff, return other errors let buf = readconfig_file("foo.txt".into()).context("read the config file")?; // do stuff, return other errors Ok(()) }

fn main() { if let Err(e) = processconfigfile() { eprintln!("Error:\n{:?}", e); } } ```

with the output: console Error: examples/simple.rs:14:51: read the config file Caused by: examples/simple.rs:7:47: Reading file: "foo.txt" Caused by: Os { code: 2, kind: NotFound, message: "No such file or directory" }

chainerror uses .source() of std::error::Error along with #[track_caller] and Location to provide a nice debug error backtrace. It encapsulates all types, which have Display + Debug and can store the error cause internally.

Along with the ChainError<T> struct, chainerror comes with some useful helper macros to save a lot of typing.

chainerror has no dependencies!

Debug information is worth it!

Features

display-cause : turn on printing a backtrace of the errors in Display

Tutorial

Read the Tutorial

License

Licensed under either of

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.