如何在 Rust 中的自定义错误枚举周围包装多个通用错误类型。 它非常简单,我只是想让它起作用。
enum Error<SPIE, PINE> {
SpiError(SPIE),
PinError(PINE),
// other custom errors
}
impl<SPIE,PINE> From<SPIE> for Error<SPIE,PINE> {
fn from(value: SPIE) -> Self {
Self::SpiError(value)
}
}
impl<SPIE,PINE> From<PINE> for Error<SPIE,PINE> {
fn from(value: PINE) -> Self {
Self::PinError(value)
}
}
编译器反而抱怨:
conflicting implementations of trait `From<_>` for type `Error<_, _>`
我明白,但也许我可以以某种方式区分这两种类型......
这是行不通的,因为没有办法将
SPIE
和 PINE
限制为不同的类型。 如果您尝试将 Foo
转换为 Error<Foo, Foo>
,应该使用哪种 From
实现?
我不确定是否有比直接构建枚举变体更好的方法。 如果您的目标是能够在函数中使用
?
,那么您可以在其之前调用 map_err
(如 .map_err(Error::SpiError)?
),将错误包装在 SpiError
变体中。
有两点可能使之更加符合人体工程学:
SpiError
后缀的类型时,名称 Error
是多余的 - 为什么不使用 enum Error<SPIE, PINE> { Spi(SPIE), Pin(PINE) }
?use Error::*;
直接导入变体。将这两者结合起来,之前的
map_err
咒语可以缩短为.map_err(Spi)?
。 它不是自动的,但也不是一大堆样板——我一直在使用这种方法。