Error handling Rust Error:编译时无法知道类型为`(dyn std::Error::Error+;';static)`的值的大小
首先,我想提到的是,在StackOverflow和web上有许多类似的问题,但我就是不知道如何解决我的案例中的这个错误 所以我有一个结构,它代表我自己的错误类型:Error handling Rust Error:编译时无法知道类型为`(dyn std::Error::Error+;';static)`的值的大小,error-handling,compiler-errors,rust,traits,Error Handling,Compiler Errors,Rust,Traits,首先,我想提到的是,在StackOverflow和web上有许多类似的问题,但我就是不知道如何解决我的案例中的这个错误 所以我有一个结构,它代表我自己的错误类型: #[derive(Debug)] pub struct Error { msg: String, } impl Display for Error { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f,
#[derive(Debug)]
pub struct Error {
msg: String,
}
impl Display for Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.msg)
}
}
impl std::error::Error for Error {
fn description(&self) -> &str {
&self.msg
}
}
然后我继续为我的错误类型执行Display
和std::error::error
:
#[derive(Debug)]
pub struct Error {
msg: String,
}
impl Display for Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.msg)
}
}
impl std::error::Error for Error {
fn description(&self) -> &str {
&self.msg
}
}
现在我尝试实现std::convert::From
,这样我就可以无缝地使用?
操作符的错误类型:
impl From<dyn std::error::Error> for Error {
fn from(err: dyn std::error::Error) -> Self {
Error {
msg: err.to_string(),
}
}
}
impl From查找错误{
fn from(err:dyn std::error::error)->Self{
错误{
msg:err.to_string(),
}
}
}
但是rust编译器给了我这个错误:
error[E0277]: the size for values of type `(dyn std::error::Error + 'static)` cannot be known
at compilation time
--> wasm_api/geohub_wasm_filehandler_api/src/lib.rs:33:6
|
33 | impl From<dyn std::error::Error> for Error {
| ^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
error[E0277]:无法知道类型为`(dyn std::error::error+'static)`的值的大小
在汇编时
-->wasm_api/geohub_wasm_filehandler_api/src/lib.rs:33:6
|
33 |因错误而从导入{
|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
我知道默认情况下,泛型函数只在编译时具有已知大小的类型上工作。但我不知道如何正确解决这个问题
谢谢你的帮助
链接到游戏场上的代码:
正如@SirDarius上面所说的,你不能对
错误这样做,因为错误不是一种类型,它是一种特性。(如果你来自OOP,想象一种特性,比如一个接口。你不能将一个接口转换成另一种类型的对象,因为接口没有任何底层状态——那里没有“there”。)
正确的处理方法是针对您需要支持的每种具体类型从实现。这确实帮助我理解了这一切是如何结合在一起的。不确定您所说的“以便我可以与?运算符无缝地使用我的错误类型”是什么意思。这个操场:似乎在您尝试的方面按预期工作。我是否误解了什么?我基本上需要将std::error::error转换为my error,以便在另一个函数中使用,该函数使用我自己的errortype返回结果-但在函数内部,我调用返回std::error::error作为其r的一部分的函数esultNote如果没有专门化(还没有进入稳定状态,请参见),您就无法将“任何实现错误的东西”转换为MyError
,因为MyError
实现Error
,而Rust已经有了一个将某些东西转换为自身的全面实现。请参阅。