diff --git a/README.md b/README.md index 403276a..1e3920e 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,67 @@ anyhow = "=1.0.0-alpha.1"
+## Details + +- Use `Result`, or equivalently `anyhow::Result`, as the + return type of any fallible function. + + Within the function, use `?` to easily propagate any error that implements the + `std::error::Error` trait. + + ```rust + use anyhow::Result; + + fn get_cluster_info() -> Result { + let config = std::fs::read_to_string("cluster.json")?; + let map: ClusterMap = serde_json::from_str(&config)?; + Ok(map) + } + ``` + +- 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. + + ```rust + use anyhow::{Context, Result}; + + fn main() -> Result<()> { + ... + it.detach().context("failed to detach the important thing")?; + + let content = std::fs::read(path) + .with_context(|| format!("failed to read instrs from {}", path))?; + ... + } + ``` + + ```console + Error: failed to read instrs from ./path/to/instrs.jsox + + caused by: + 0: 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. + + ```rust + // If the error was caused by redaction, then return a + // tombstone instead of the content. + match root_cause.downcast_ref::() { + Some(DataStoreError::Censored(_)) => Ok(Poll::Ready(REDACTED_CONTENT)), + None => Err(error), + } + ``` + +- 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, the + `RUST_LIB_BACKTRACE=1` environment variable must be defined. + +
+ ## Acknowledgements The implementation of the `anyhow::Error` type is identical to