相关疑难解决方法(0)

这个问号操作员是关于什么的?

我正在阅读以下文档File:

//..
let mut file = File::create("foo.txt")?;
//..
Run Code Online (Sandbox Code Playgroud)

什么是?在这条线?我不记得以前在Rust Book中看过它了.

rust

58
推荐指数
3
解决办法
2万
查看次数

如何在Rust中定义自定义`Error`类型?

我正在编写一个可以返回几个不同错误中的几个错误的函数.

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特性?

error-handling rust

33
推荐指数
3
解决办法
8795
查看次数

您能否返回适用于任何可能的错误类型的结果?

我想使用多个库,每个库都有自己的错误类型。我并不真正关心每个特定板条箱的错误类型,我想使用?习惯用法来使用那些返回类型的板条箱的方法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)

error-handling rust

8
推荐指数
1
解决办法
2495
查看次数

标签 统计

rust ×3

error-handling ×2