是否可以在没有枚举的结构中存储错误原因?

时间:2015-02-08 11:25:26

标签: rust

我正在Rust中编写一个库,并且希望API只显示我自己的错误类型,以及由内部包含在该类型中的库引起的任何错误。我想实现Error特征并将原始错误公开为"原因"。我可以通过执行以下操作来执行此操作:

enum MyErrorCause {
    Zip(ZipError),
    Io(IoError),
    None
}

pub struct MyError {
    cause: MyErrorCause
}

impl Error for MyError {
    fn description(&self) -> &str { "an error" }

    fn cause(&self) -> Option<&Error> {
        match self.cause {
            MyErrorCause::Zip(ref err) => Some(err as &Error),
            MyErrorCause::Io(ref err) => Some(err as &Error),
            MyErrorCause::None => None
        }
    }
}

问题是我必须为每种原因类型添加枚举变体和几乎相同的匹配臂,而我只是将它们作为通用Error引用公开给用户。是否可以将原因Error存储在MyError结构中?我仍然希望MyError拥有原因。

1 个答案:

答案 0 :(得分:2)

如果您不介意为每个错误分配内存的开销,您可以存储Option<Box<Error + 'static>>作为原因。在创建MyError时,只需使用Some(Box::new(the_cause) as Box<Error>即可。 'static限制是让编译器知道你存储的任何错误都不得在其中包含短期引用。

另一种选择是编写一个扩展为所需enumimpl的宏,但这似乎有些过分。