Error handling Rust Error:编译时无法知道类型为`(dyn std::Error::Error+;';static)`的值的大小

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,

首先,我想提到的是,在StackOverflow和web上有许多类似的问题,但我就是不知道如何解决我的案例中的这个错误

所以我有一个结构,它代表我自己的错误类型:

#[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已经有了一个将某些东西转换为自身的全面实现。请参阅。