我想使用多个库,每个库都有自己的错误类型。我并不真正关心每个特定板条箱的错误类型,我想使用?
习惯用法是使用那些返回 a 的 crate 的方法Result
type.
我也不想解开这些值,如果遇到错误,这会导致恐慌。我可能只是想使用传播不同的错误?
到顶部,如果我愿意的话,也许可以选择处理它们或忽略它们。
我不能这样做std::result::Result<T, E>
因为我不知道返回的错误类型(就像我说的,每个板条箱都可以返回自己的错误)。
我知道 Rust 中没有“面向对象”的多态性,但有特征对象。由于在编译时无法知道特征对象的大小,因此我们必须将它们隐藏在某种指针后面,例如&
or Box<_>
.
错误实现的基本特征似乎是std::error::Error
.
我见过的一件事是fn foo() -> Result<Blah, Box<dyn Error>>
策略,它利用了特质对象的概念。
这种策略的问题是没有一个包返回装箱错误,这导致编译器抱怨同样的问题。
一个示例用例:
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)
}
有一个简单的方法可以解决这个问题吗?我可以轻松地抽象出所有不同的错误并返回一个Result
所以我可以使用?
idiom?