gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:48:22 25 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/62659592/

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