(英语不是我的母语;请原谅输入错误。)
在我的项目中,有一个错误类型:
pub type RvzResult<T> = Result<T, RvzError>;
#[derive(Error, Debug)]
pub enum RvzError {
// some error types...
,
OtherErr(Box<dyn Error>)
}
Run Code Online (Sandbox Code Playgroud)
有一天,我有一个Mutex对象并像这样使用它:
pub fn some_func() -> RvzResult<()> {
// ...
let lock = the_mutex.lock()?;
// ...
}
Run Code Online (Sandbox Code Playgroud)
但 rustc 不太高兴:error[E0277]: '?' couldn't convert the error to 'RvzError'
我尝试From像这样实现特征:
impl <T> From<PoisonError<T>> for RvzError {
fn from(err: PoisonError<T>) -> Self {
Self::OtherErr(Box::new(err))
}
}
Run Code Online (Sandbox Code Playgroud)
它失败了:error[E0310]: the parameter type 'T' may not live long enough
APoisonError不仅仅是一个错误代码,而且有一个特殊的功能:它允许您绕过锁中毒检查并无论如何访问数据。PoisonError 的参数是可以要求返回的<T>锁保护对象,因此函数中的 是借用的。PoisonErrorthe_mutex
因此,它不能被制成 a Box<dyn Error>(这是隐式的+ \'static)并且无论如何都不应该被返回some_func()。相反,创建一个新错误,该错误不会尝试包含原始PoisonError值 \xe2\x80\x94\xc2\xa0 的变体RvzError:
impl<T> From<PoisonError<T>> for RvzError {\n fn from(err: PoisonError<T>) -> Self {\n Self::Poison\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n或盒装字符串错误(使用此 impl):
\nimpl<T> From<PoisonError<T>> for RvzError {\n fn from(_: PoisonError<T>) -> Self {\n Self::OtherErr(Box::<dyn Error>::from("PoisonError"))\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
732 次 |
| 最近记录: |