更简单的方法来返回自定义错误类型无论如何::错误?

fad*_*bee 11 error-handling rust

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

fn foo() -> anyhow::Result<()> {
    ...
    Err(anyhow::Error::new(
        MyError::MyVariant {
            actual: 0,
            expected: 1
        }
    ))
}
Run Code Online (Sandbox Code Playgroud)

有没有更简洁的方法来返回 的实例MyError

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

Nei*_*kos 19

您可以使用anyhow::bail! 宏。它完全考虑到了您的用例:

use anyhow::bail;

fn foo() -> anyhow::Result<()> {
    if errored {
        bail!(MyError::MyVariant { actual: 0, expected: 1 })
    }
}
Run Code Online (Sandbox Code Playgroud)

正如 Filipe 在评论中正确指出的那样,如果您发现自己检查简单的条件并返回错误,您可以通过使用与butanyhow::ensure!非常相似而不是恐慌来简化此步骤。assert!return

use anyhow::ensure;

fn foo() -> anyhow::Result<()> {
    ensure!(!errored, MyError::MyVariant { actual: 0, expected: 1 });
}
Run Code Online (Sandbox Code Playgroud)

  • 对于检查条件和保释的这种特定情况,我将使用“anyhow::ensure!(!errored, MyError::MyVariant {actual: 0, Expected: 1 })”。 (2认同)