首页 > 解决方案 > 使用 anyhow::Error 返回自定义错误类型的更简单方法?

问题描述

我有工作代码,它以下列方式返回错误:

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

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

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

标签: error-handlingrust

解决方案


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

use anyhow::bail;

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

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

use anyhow::ensure;

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

推荐阅读