rust 如何使用thiserror转发带有泛型类型参数的错误

bvjveswy  于 2023-01-02  发布在  其他
关注(0)|答案(1)|浏览(229)

在学习Rust时,我使用thiserror来 Package 一些异常。
这是我想从unrar Package 箱中 Package 的异常:

#[derive(PartialEq)]
pub struct UnrarError<T> {
    pub code: Code,
    pub when: When,
    pub data: Option<T>,
}

我自己的代码是这样的:

#[derive(Debug, Error)]
pub enum MyError {

    #[error(transparent)]
    Io(#[from] io::Error),

    #[error(transparent)]
    Unrar(#[from] unrar::error::UnrarError), // <-- missing generics

    #[error("directory already exists")]
    DirectoryExists,
}

编译器抱怨UnrarError上缺少泛型类型参数。
因此,我可以添加一个类型参数:

#[derive(Debug, Error)]
pub enum MyError<T> {

    #[error(transparent)]
    Io(#[from] io::Error),

    #[error(transparent)]
    Unrar(#[from] unrar::error::UnrarError<T>),

    #[error("directory already exists")]
    DirectoryExists,
}

但是如果我这样做了,现在我所有使用MyError的代码都需要关心这个类型参数,实际上它都不关心这个参数。
我应该如何习惯性地处理这种情况?

az31mfrm

az31mfrm1#

我建议你使用特定的类型或者添加你自己的变体。UnrarError被设计成泛型的,而不是泛型的。
请尝试以下操作:

#[derive(Debug, Error)]
pub enum MyError {

    #[error(transparent)]
    Io(#[from] io::Error),

    #[error(transparent)]
    Unrar(#[from] unrar::error::UnrarError<OpenArchive>),

    #[error(transparent)]
    UnrarProcessing(#[from] unrar::error::UnrarError<Vec<Entry>>),

    #[error("directory already exists")]
    DirectoryExists,
}

或者在这种情况下我更喜欢怎么做:

#[derive(Debug, Error)]
pub enum MyError {

    #[error(transparent)]
    Io(#[from] io::Error),

    #[error("unrar error")]
    Unrar,

    #[error("directory already exists")]
    DirectoryExists,
}

impl<T> From<unrar::error::UnrarError<T>> for MyError {
    fn from(err: unrar::error::UnrarError<T>) -> Self {
        // Get details from the error you want,
        // or even implement for both T variants.
        Self::Unrar
    }
}

相关问题