601ec251f8
This patch adds support for multiple rustdoc output formats to the test suite. This is a preparation for adding support for rustdoc’s JSON output.
121 lines
4.2 KiB
Plaintext
121 lines
4.2 KiB
Plaintext
---
|
||
source: tests/output.rs
|
||
expression: "get_stdout(&[item])"
|
||
---
|
||
anyhow Trait anyhow::Context rusty-man
|
||
|
||
SYNOPSIS
|
||
pub trait Context<T, E>: Sealed {
|
||
fn context<C>(self, context: C) -> Result<T, Error>
|
||
where
|
||
C: Display + Send + Sync + 'static;
|
||
fn with_context<C, F>(self, f: F) -> Result<T, Error>
|
||
where
|
||
C: Display + Send + Sync + 'static,
|
||
F: FnOnce() -> C;
|
||
}
|
||
|
||
DESCRIPTION
|
||
Provides the `context` method for `Result`.
|
||
|
||
This trait is sealed and cannot be implemented for types outside of `anyhow`.
|
||
|
||
|
||
# Example
|
||
|
||
use anyhow::{Context, Result};
|
||
use std::fs;
|
||
use std::path::PathBuf;
|
||
pub struct ImportantThing {
|
||
path: PathBuf,
|
||
}
|
||
impl ImportantThing {
|
||
pub fn detach(&mut self) -> Result<()> {...}
|
||
}
|
||
pub fn do_it(mut it: ImportantThing) -> Result<Vec<u8>> {
|
||
it.detach().context("Failed to detach the important thing")?;
|
||
let path = &it.path;
|
||
let content = fs::read(path)
|
||
.with_context(|| format!("Failed to read instrs from {}", path.display()))?;
|
||
Ok(content)
|
||
}
|
||
|
||
When printed, the outermost context would be printed first and the lower level underlying
|
||
causes would be enumerated below.
|
||
|
||
`Error: Failed to read instrs from ./path/to/instrs.json
|
||
Caused by:
|
||
No such file or directory (os error 2)
|
||
`
|
||
|
||
|
||
|
||
# Effect on downcasting
|
||
|
||
After attaching context of type `C` onto an error of type `E`, the resulting `anyhow::Error`
|
||
may be downcast to `C` **or** to `E`.
|
||
|
||
That is, in codebases that rely on downcasting, Anyhow's context supports both of the
|
||
following use cases:
|
||
|
||
* **Attaching context whose type is insignificant onto errors whose type is used in
|
||
downcasts.**
|
||
|
||
In other error libraries whose context is not designed this way, it can be risky to
|
||
introduce context to existing code because new context might break existing working
|
||
downcasts. In Anyhow, any downcast that worked before adding context will continue to work
|
||
after you add a context, so you should freely add human-readable context to errors wherever
|
||
it would be helpful.
|
||
|
||
use anyhow::{Context, Result};
|
||
fn do_it() -> Result<()> {
|
||
helper().context("Failed to complete the work")?;
|
||
...
|
||
}
|
||
fn main() {
|
||
let err = do_it().unwrap_err();
|
||
if let Some(e) = err.downcast_ref::<SuspiciousError>() {
|
||
// If helper() returned SuspiciousError, this downcast will
|
||
// correctly succeed even with the context in between.
|
||
}
|
||
}
|
||
* **Attaching context whose type is used in downcasts onto errors whose type is
|
||
insignificant.**
|
||
|
||
Some codebases prefer to use machine-readable context to categorize lower level errors in a
|
||
way that will be actionable to higher levels of the application.
|
||
|
||
use anyhow::{Context, Result};
|
||
fn do_it() -> Result<()> {
|
||
helper().context(HelperFailed)?;
|
||
...
|
||
}
|
||
fn main() {
|
||
let err = do_it().unwrap_err();
|
||
if let Some(e) = err.downcast_ref::<HelperFailed>() {
|
||
// If helper failed, this downcast will succeed because
|
||
// HelperFailed is the context that has been attached to
|
||
// that error.
|
||
}
|
||
}
|
||
|
||
METHODS
|
||
Required Methods
|
||
context
|
||
fn context<C>(self, context: C) -> Result<T, Error>
|
||
where
|
||
C: Display + Send + Sync + 'static,
|
||
|
||
Wrap the error value with additional context.
|
||
|
||
with_context
|
||
fn with_context<C, F>(self, f: F) -> Result<T, Error>
|
||
where
|
||
C: Display + Send + Sync + 'static,
|
||
F: FnOnce() -> C,
|
||
|
||
Wrap the error value with additional context that is evaluated lazily only once an error
|
||
does occur.
|
||
|
||
|