Comments (3)
Our "context" works a bit differently than failure's to support the interactions with downcasting, but you could accomplish exactly the same ErrorKind pattern using this extension trait:
// put this somewhere that's shared across all your error types
pub struct WithKind<K> {
pub kind: K,
pub source: anyhow::Error,
}
pub trait Kind {
type Ok;
fn kind<K>(self, kind: K) -> Result<Self::Ok, WithKind<K>>;
}
impl<T, E> Kind for Result<T, E>
where
E: Into<anyhow::Error>,
{
type Ok = T;
fn kind<K>(self, kind: K) -> Result<T, WithKind<K>> {
self.map_err(|e| WithKind {
kind,
source: e.into(),
})
}
}
Then do everything in the link:
use thiserror::Error;
#[derive(Error, Debug)]
#[error("{kind}")]
pub struct Error {
kind: ErrorKind,
source: anyhow::Error,
}
#[derive(Error, Debug, Copy, Clone, Eq, PartialEq)]
pub enum ErrorKind {
#[error("network failure")]
NetworkFailure,
}
impl Error {
pub fn kind(&self) -> ErrorKind {
self.kind
}
}
impl From<WithKind<ErrorKind>> for Error {
fn from(w: WithKind<ErrorKind>) -> Self {
Error {
kind: w.kind,
source: w.source,
}
}
}
and it gets used as:
use std::io;
fn inner() -> Result<(), io::Error> {
Err(io::Error::new(io::ErrorKind::Other, "inner did not work"))
}
fn outer() -> Result<(), crate::Error> {
inner().kind(ErrorKind::NetworkFailure)?;
Ok(())
}
fn main() -> Result<(), anyhow::Error> {
outer()?;
Ok(())
}
from anyhow.
Thanks! It works for me. One question why not just implement ResultExt::kind that will translate directly to Result<T, Error> like without WithKind proxy?
pub type Result<T> = std::result::Result<T, Error>;
pub trait ResultExt<T, E> {
fn kind(self, kind: ErrorKind) -> Result<T>;
}
impl<T, E> ResultExt<T, E> for std::result::Result<T, E>
where
E: std::error::Error + Send + Sync + 'static,
{
fn kind(self, kind: ErrorKind) -> Result<T> {
self.map_err(|e| Error {
kind,
source: e.into(),
})
}
}
from anyhow.
Your trait requires a different extension trait for every error type in your program. If your program only always uses one error type then maybe that's fine. But with my trait, downstream code is able to always import the same trait.
from anyhow.
Related Issues (20)
- backtrace seems to only work with opt-level=0 HOT 5
- Error display inconsistent HOT 1
- Couldn't use with nom error HOT 2
- the following trait bounds were not satisfied: `(): anyhow::context::ext::StdError` HOT 1
- Use `#[track_caller]` to provide info on where the error was created HOT 1
- Allow source errors to expose their own context? HOT 1
- `build.rs` should not detect nightly feature HOT 11
- [Question] In `{:#?}` why is the outermost context called "caused by" and how is `Context` expected to be used? HOT 1
- `ensure!` macro implementation details HOT 8
- Nightly feature wrongly enabled on stable toolchain HOT 3
- Should `anyhow::Error::chain` return `dyn Error + Send + Sync` HOT 2
- Customize backtrace logic?
- `anyhow!(e)` doesn't preserve `source` for `&Error` HOT 1
- A way to disable anyhow stacktraces (without disabling stacktraces from other crates) HOT 2
- Default Ok-type to `()` in `anyhow::Result` typedef HOT 2
- Updating from version 1.0.76 breaks backtraces HOT 2
- Make backtrace support optional HOT 10
- Possible performance regression on Windows HOT 5
- as_ref() type must be known at this point
- Depending on `CARGO_ENCODED_RUSTFLAGS` may produce stale builds HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from anyhow.