gpt4 book ai didi

error-handling - 合并两种错误类型最惯用的方法是什么?

转载 作者:行者123 更新时间:2023-11-29 08:13:51 24 4
gpt4 key购买 nike

我有一个类型 Foo,它的方法可能会“引发”关联类型 Foo::Err 的错误。

pub trait Foo {
type Err;

fn foo(&mut self) -> Result<(), Self::Err>;
}

我有另一个特性 Bar,它有一个方法来处理 FooBar 可能会发出自己的错误(由关联类型 Bar::Err 指定),但它也可能遇到 Foo 生成的错误正在处理。

我可以看到两种方法来做到这一点,但我不知道哪种方法最适合 Rust。

第一个在结果中嵌入一个结果:

pub trait Bar1 {
type Err;

fn bar<F: Foo>(&mut self, foo: F) -> Result<Result<F, F::Err>, Self::Err>;
}

第二个将两种错误类型合并到一个专用枚举中:

pub trait Bar2 {
type Err;

fn bar<F: Foo>(&mut self, foo: F) -> Result<F, Choice<F::Err, Self::Err>>;
}

第二个在语义上看起来更清晰,但为处理额外的枚举制造了一些障碍。

playground

最佳答案

通常您不会执行“合并”,而是使用嵌套错误,就像这样。

enum IntError {
Overflow,
Underflow
}

enum StrError {
TooLong,
TooShort,
}

enum GenericError {
Int(IntError),
Str(StrError),
}

impl From<IntError> for GenericError {
fn from(e: IntError) -> Self {
GenericError::Int(e)
}
}

impl From<StrError> for GenericError {
fn from(e: StrError) -> Self {
GenericError::Str(e)
}
}

关于error-handling - 合并两种错误类型最惯用的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52438988/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com