Error handling 使用anyhow::error返回自定义错误类型的更简单的方法?

Error handling 使用anyhow::error返回自定义错误类型的更简单的方法?,error-handling,rust,Error Handling,Rust,我的工作代码以以下方式返回错误: fn foo() -> anyhow::Result<()> { ... Err(anyhow::Error::new( MyError::MyVariant { actual: 0, expected: 1 } )) } fn foo()->无论如何::结果{ ... Err(无论如何::Error::new( MyError::MyVa

我的工作代码以以下方式返回错误:

fn foo() -> anyhow::Result<()> {
    ...
    Err(anyhow::Error::new(
        MyError::MyVariant {
            actual: 0,
            expected: 1
        }
    ))
}
fn foo()->无论如何::结果{
...
Err(无论如何::Error::new(
MyError::MyVariant{
实际值:0,
预期:1
}
))
}
是否有更简洁的方法返回
MyError
的实例

(省略
anyhow::Error::new(
wrapper会导致类型检查错误,因为
MyError
不是
anyhow::Error
的实例)

您可以使用宏。它正是您考虑的用例:

无论如何都要使用::bail;
fn foo()->无论如何::结果{
如果出错{
bail!(MyError::MyVariant{actual:0,预期为:1})
}
}
正如Filipe在注释中正确指出的那样,如果您发现自己正在检查简单条件并返回错误,您可以通过使用类似于
assert!
return
s而不是恐慌来简化此步骤

无论如何使用::确保; fn foo()->无论如何::结果{ 确保!(!errored,MyError::MyVariant{actual:0,应为:1}); }
对于检查条件和保释的特定情况,我会使用
无论如何::确保!(!errored,MyError::MyVariant{actual:0,expected:1})
@FilipeRodrigues你说得对!我添加了它。