| backtrace.rs |
|
979 |
- |
| chain.rs |
|
2723 |
- |
| context.rs |
|
4691 |
60 % |
| ensure.rs |
|
51113 |
- |
| error.rs |
... |
39200 |
45 % |
| fmt.rs |
|
4233 |
- |
| kind.rs |
no std error impl |
3230 |
0 % |
| lib.rs |
[![github]](https://github.com/dtolnay/anyhow) [![crates-io]](https://crates.io/crates/anyhow) [![docs-rs]](https://docs.rs/anyhow)
[github]: https://img.shields.io/badge/github-8da0cb?style=for-the-badge&labelColor=555555&logo=github
[crates-io]: https://img.shields.io/badge/crates.io-fc8d62?style=for-the-badge&labelColor=555555&logo=rust
[docs-rs]: https://img.shields.io/badge/docs.rs-66c2a5?style=for-the-badge&labelColor=555555&logo=docs.rs
<br>
This library provides [`anyhow::Error`][Error], a trait object based error
type for easy idiomatic error handling in Rust applications.
<br>
# Details
- Use `Result<T, anyhow::Error>`, or equivalently `anyhow::Result<T>`, as
the return type of any fallible function.
Within the function, use `?` to easily propagate any error that implements
the [`std::error::Error`] trait.
```
# pub trait Deserialize {}
#
# mod serde_json {
# use super::Deserialize;
# use std::io;
#
# pub fn from_str<T: Deserialize>(json: &str) -> io::Result<T> {
# unimplemented!()
# }
# }
#
# struct ClusterMap;
#
# impl Deserialize for ClusterMap {}
#
use anyhow::Result;
fn get_cluster_info() -> Result<ClusterMap> {
let config = std::fs::read_to_string("cluster.json")?;
let map: ClusterMap = serde_json::from_str(&config)?;
Ok(map)
}
#
# fn main() {}
```
- Attach context to help the person troubleshooting the error understand
where things went wrong. A low-level error like "No such file or
directory" can be annoying to debug without more context about what higher
level step the application was in the middle of.
```
# struct It;
#
# impl It {
# fn detach(&self) -> Result<()> {
# unimplemented!()
# }
# }
#
use anyhow::{Context, Result};
fn main() -> Result<()> {
# return Ok(());
#
# const _: &str = stringify! {
...
# };
#
# let it = It;
# let path = "./path/to/instrs.json";
#
it.detach().context("Failed to detach the important thing")?;
let content = std::fs::read(path)
.with_context(|| format!("Failed to read instrs from {}", path))?;
#
# const _: &str = stringify! {
...
# };
#
# Ok(())
}
```
```console
Error: Failed to read instrs from ./path/to/instrs.json
Caused by:
No such file or directory (os error 2)
```
- Downcasting is supported and can be by value, by shared reference, or by
mutable reference as needed.
```
# use anyhow::anyhow;
# use std::fmt::{self, Display};
# use std::task::Poll;
#
# #[derive(Debug)]
# enum DataStoreError {
# Censored(()),
# }
#
# impl Display for DataStoreError {
# fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
# unimplemented!()
# }
# }
#
# impl std::error::Error for DataStoreError {}
#
# 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.downcast_ref::<DataStoreError>() {
Some(DataStoreError::Censored(_)) => Ok(Poll::Ready(REDACTED_CONTENT)),
None => Err(error),
}
# ;
```
- If using Rust ≥ 1.65, a backtrace is captured and printed with the
error if the underlying error type does not already provide its own. In
order to see backtraces, they must be enabled through the environment
variables described in [`std::backtrace`]:
- 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=1` and
`RUST_LIB_BACKTRACE=0`.
[`std::backtrace`]: std::backtrace#environment-variables
- Anyhow works with any error type that has an impl of `std::error::Error`,
including ones defined in your crate. We do not bundle a `derive(Error)`
macro but you can write the impls yourself or use a standalone macro like
[thiserror].
[thiserror]: https://github.com/dtolnay/thiserror
```
use thiserror::Error;
#[derive(Error, Debug)]
pub enum FormatError {
#[error("Invalid header (expected {expected:?}, got {found:?})")]
InvalidHeader { |
21195 |
100 % |
| macros.rs |
state |
7072 |
- |
| nightly.rs |
|
1563 |
- |
| ptr.rs |
|
3265 |
- |
| wrapper.rs |
|
1964 |
0 % |