gpt4 book ai didi

error-handling - 创建新错误时重复使用现有错误的描述

转载 作者:行者123 更新时间:2023-11-29 07:55:38 25 4
gpt4 key购买 nike

我在 Rust 中有以下代码,它无法编译,但显示了我想做的事情的意图。

    pub fn parse(cursor: &mut io::Cursor<&[u8]>) -> io::Result<Ack> {
use self::byteorder::{BigEndian, ReadBytesExt};
use self::core::error::Error;

match cursor.read_u16::<BigEndian>() {
Err(byteorder::Error::Io(error)) => Err(error),
Err(error) =>
Err(io::Error::new(io::ErrorKind::Other, error.description(),
None)),
Ok(value) => Ok(Ack { block_number: value })
}
}

本质上,我想获取字节顺序库返回的错误的错误描述,并使用它来创建错误描述,我将传回给我的库的用户。这失败了 packets.rs:166:58:166:63 error:errordoes not live long enough,我明白为什么。

byteorder 库通过在 byteorder::Error::Io 构造函数中包装一个 std::io::Result 来解决这个问题。但是,我不想走这条路,因为我必须定义自己的错误类型来包装 std::io::Errorbyteorder::Error。在我看来,我的用户不应该知道或关心我使用字节顺序库,它不应该成为我界面的一部分。

我是 Rust 新手,还不知道语言和设计的惯用语和最佳实践。我有哪些处理方案?

最佳答案

你的问题其实是io::Error::new()的第二个参数是&'static str,而byteorder::Error::description()返回一个 &'a str,其中 'a 是错误对象本身的生命周期,它小于 'static。因此,您不能将它用于 io::Error 的描述。

最简单的修复方法是将 byteorder::Error 描述移动到 io::Errordetail 字段:

Err(error) =>
Err(io::Error::new(
io::ErrorKind::Other,
"byteorder error",
Some(error.description().to_string())
)),

但是,您应该认真考虑制作一个自定义包装器错误类型来封装所有“下游”错误。写得正确 FromError实例你应该能够写出类似的东西

try!(cursor.read_u16::<BigEndian>()
.map(|value| Ack { block_number: value }))

而不是你的整场比赛。当您的程序增长并且出现更多“下游”错误源时,自定义错误包装器也会为您提供帮助 - 您可以添加新的枚举变体和/或 FromError 实现来支持这些新错误。

关于error-handling - 创建新错误时重复使用现有错误的描述,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29158680/

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