gpt4 book ai didi

error-handling - 你能返回一个适用于任何可能错误类型的结果吗?

转载 作者:行者123 更新时间:2023-12-03 08:43:30 24 4
gpt4 key购买 nike

我想使用多个库,每个库都有自己的错误类型。我并不关心每个特定 crate 的错误类型,我想使用 ?使用返回 Result 的那些 crate 的方法的习惯用法类型。

我也不想打开这些值,如果遇到错误会导致 panic 。我可能只想使用 ? 传播不同的错误。如果我愿意,可能会选择处理它们或忽略它们。

我不能用 std::result::Result<T, E> 做到这一点因为我不知道返回的错误类型(就像我说的,每个箱子都可以返回自己的错误)。

我知道在 Rust 中没有“面向对象”的多态性,但有特征对象。由于在编译时无法知道 trait 对象的大小,我们必须将它们隐藏在某种指针后面,例如 &Box<_> .

错误实现的基本特征似乎是 std::error::Error .

我见过的一件事是fn foo() -> Result<Blah, Box<dyn Error>>策略,它利用了特征对象的概念。

这个策略的问题是没有一个 crate 返回一个装箱错误,这导致编译器提示同样的问题。

一个示例用例:

use native_tls::TlsConnector; // 0.2.3
use std::io::{Read, Write};
use std::net::TcpStream;

fn main() {
match do_stuff() {
Ok(string) => {
println!("{}", string);
}
_ => {
println!("Failed!");
}
}
}

fn do_stuff() -> Result<String, Box<(dyn std::error::Error + 'static)>> {
let connector = TlsConnector::new()?;

let stream = TcpStream::connect("jsonplaceholder.typicode.com:443")?;
let mut stream = connector.connect("jsonplaceholder.typicode.com", stream)?;

stream.write_all(b"GET /todos/1 HTTP/1.0\r\n\r\n")?;
let mut res = vec![];
stream.read_to_end(&mut res)?;
String::from_utf8(res)
}

playground

有没有解决这个问题的简单方法?我可以轻松地抽象出所有不同的错误并返回 Result所以我可以使用 ?成语?

最佳答案

Can you return a Result that works with any possible error type?



你不能。从表面上看,这是没有道理的。泛型类型是由函数的调用者选择的,那么函数如何创建一个由其他人选择的错误,而不被告知如何构造它?

也就是说,您的问题很容易解决。你说:

so I can use the ? idiom



如果您始终如一地这样做,您的程序将编译:
let s = String::from_utf8(res)?;
Ok(s)

您也可以直接转换错误类型:
String::from_utf8(res).map_err(Into::into)

none of the crates return a boxed error, which leads to the compiler complaining about the same



它不适用于 5 您使用过的其他情况 ? ,所以不清楚你为什么发表这个声明。

具体来说, Box<dyn Error>可以 be created from any type that implements Error :
impl<'a, E: Error + 'a> From<E> for Box<dyn Error + 'a> {
fn from(err: E) -> Box<dyn Error + 'a> {
Box::new(err)
}
}
?接线员电话 From::from在引擎盖下为您服务。

也可以看看:
  • What is this question mark operator about?
  • How to manually return a Result<(), Box<dyn Error>>?
  • Rust proper error handling (auto convert from one error type to another with question mark)
  • 关于error-handling - 你能返回一个适用于任何可能错误类型的结果吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59584485/

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