我正在阅读以下文档File
:
//..
let mut file = File::create("foo.txt")?;
//..
Run Code Online (Sandbox Code Playgroud)
什么是?
在这条线?我不记得以前在Rust Book中看过它了.
我正在编写一个可以返回几个不同错误中的几个错误的函数.
fn foo(...) -> Result<..., MyError> {}
Run Code Online (Sandbox Code Playgroud)
我可能需要定义自己的错误类型来表示这样的错误.我假设这可能是一个enum
错误,一些enum
变种附带了诊断数据:
enum MyError {
GizmoError,
WidgetNotFoundError(widget_name: String)
}
Run Code Online (Sandbox Code Playgroud)
这是最惯用的方式吗?我该如何实现这个Error
特性?
我想使用多个库,每个库都有自己的错误类型。我并不真正关心每个特定板条箱的错误类型,我想使用?
习惯用法来使用那些返回类型的板条箱的方法Result
。
我也不想解开这些值,如果遇到错误,这会导致恐慌。我可能只是想将不同的错误传播?
到顶部,并且如果我愿意的话,也许可以选择处理它们或忽略它们。
我不能用 a 做到这一点,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 …
Run Code Online (Sandbox Code Playgroud)