Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Error handling 支持有生命周期的错误,以便有一个源_Error Handling_Rust - Fatal编程技术网

Error handling 支持有生命周期的错误,以便有一个源

Error handling 支持有生命周期的错误,以便有一个源,error-handling,rust,Error Handling,Rust,我有以下3个错误,AError,BError和CError,其中CError包含从某些输入中借用的字符串,AError由BError或CError组成,因此也有一个生存期 使用std::error::error; 使用std::fmt; #[导出(调试)] 酒店编号(Aeror), } 恳求{ fn fmt(&self,f:&mut fmt::错误的格式化程序错误{ 匹配自我{ 错误::B(err)=>一些(err), AError::C()=>None,//如果我尝试使用`C(err)=>So

我有以下3个错误,
AError
BError
CError
,其中
CError
包含从某些输入中借用的字符串,
AError
BError
CError
组成,因此也有一个生存期

使用std::error::error;
使用std::fmt;
#[导出(调试)]
酒店编号(Aeror),
}
恳求{
fn fmt(&self,f:&mut fmt::错误的格式化程序错误{
匹配自我{
错误::B(err)=>一些(err),
AError::C()=>None,//如果我尝试使用`C(err)=>Some(err)`it errors
}
}
}
#[导出(调试)]
pub struct BError;
impl fmt::显示错误{
fn fmt(&self,f:&mut fmt::格式化程序){
c:&'a街,
}
恳求{
fn fmt(&self,f:&mut fmt::CError src/lib的格式化程序错误。rs:16:6
|
16 | impl{
|      ^^
注意:…以便类型兼容
-->src/lib.rs:18:15
|
18 |匹配自我{
|               ^^^^
=注意:应为“&A错误”`
=注意:但是,生存期必须对静态生存期有效。。。
注意:…因此表达式是可赋值的
-->src/lib.rs:18:9
|
18 |/匹配自我{
19 | | AError::B(err)=>一些(err),
20 | | AError::C(err)=>一些(err),
21 | |         }
| |_________^
=注意:应为`选项

我知道为了能够向下转换,您必须有一个静态引用,但我只想使用
source
打印错误的回溯,如下所示:

pub fn fmt_err(err:&dyn Error,f:&mut fmt::Formatter)->fmt::Result{
写!(f,{},err)?;
如果让某些(源)=err.source(){
fmt_错误(来源,f)?;
}
好(())
}
它不需要向下转换,只是使用了
fmt::Display
Error
的一个超级特征这一事实

我如何使我在生命周期中的错误支持这种类型的用例?

我知道
Error::cause
存在,但它已被弃用,可能不适用于此用例,并且流行的错误派生库(例如
thisrerror
)也可能无法实现它,因此我必须将
源代码作为获取底层错误的唯一方法


我唯一的选择是创建我自己的特性并在生命周期内实现它吗?

“fmt::Display是错误的超级特性”-事实上,fmt::Display不是错误的超级特征。它说实现错误的类型也必须实现显示。这是一个细微差别,但有时很重要。@lpiepiora我认为这就是超级特征的定义,不是吗?正如这里解释的