我正在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
拥有原因。
答案 0 :(得分:2)
如果您不介意为每个错误分配内存的开销,您可以存储Option<Box<Error + 'static>>
作为原因。在创建MyError
时,只需使用Some(Box::new(the_cause) as Box<Error>
即可。 'static
限制是让编译器知道你存储的任何错误都不得在其中包含短期引用。
另一种选择是编写一个扩展为所需enum
和impl
的宏,但这似乎有些过分。