如何在 Rust 中的自定义错误枚举周围包装多个通用错误类型

问题描述 投票:0回答:1

如何在 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<_, _>`

我明白,但也许我可以以某种方式区分这两种类型......

rust
1个回答
0
投票

这是行不通的,因为没有办法将

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)?
。 它不是自动的,但也不是一大堆样板——我一直在使用这种方法。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.