是否有可能一次处理多个不同的错误,而不是在Rust without using additional functions中单独处理?简而言之:Rust等同于try-catch语句是什么?

像这样的功能(First-class error handling with ? and catch)早在2016年就被提出了,但我不知道它产生了什么,以及2019年针对此类问题的解决方案会是什么样子.

例如,做这样的事情:

try {
    do_step_1()?;
    do_step_2()?;
    do_step_3()?;
    // etc
} catch {
    alert_user("Failed to perform necessary steps");
}

而不是:

match do_steps() {
    Ok(_) => (),
    _ => alert_user("Failed to perform necessary steps")
}

// Additional function:
fn do_steps() -> Result<(), Error>{
    do_step_1()?;
    do_step_2()?;
    do_step_3()?;
    // etc
    Ok(())
}

我的程序有一个函数,可以判断注册表中不同位置的不同数据值,并返回一些聚合数据.它需要在循环的其他try-catch内部使用许多try-cache语句.

推荐答案

Rust中没有try-catch语句.最接近的方法是?操作员.

然而,你不必创建一个函数和一个match语句来最终解决它.您可以在自己的范围内定义一个闭包,并在闭包内使用?运算符.然后,抛出被保存在闭包返回值中,您可以在任何地方捕获它,如下所示:

fn main() {
    let do_steps = || -> Result<(), MyError> {
        do_step_1()?;
        do_step_2()?;
        do_step_3()?;
        Ok(())
    };

    if let Err(_err) = do_steps() {
        println!("Failed to perform necessary steps");
    }
}

Playground

是否可以一次处理多个不同的错误,而不是在不使用其他功能的情况下单独处理?

目前,大多数推荐使用anyhow crate 来管理 rust 病.

作为替代方案,有一个failure crate 用于Rust中的错误管理.使用Failure,可以链接、转换、连接错误.将错误类型转换为一种常见类型后,您可以轻松捕获(处理)它.

Rust相关问答推荐

如何访问Rust存储值的内存地址

如何使用Match比较 struct 中的值

创建包含缺失值的框架

这个规则关于或模式到底是什么意思?如果表达片段的类型与p_i|q_i...&q;不一致,就会形成

在执行其他工作的同时,从共享裁判后面的VEC中删除重复项

如何导入crate-type=[";cdylib;]库?

如何将映射反序列化为具有与键匹配的字段的定制 struct 的向量?

如何重命名 clap_derive 中的子命令占位符?

在 Rust 中,是否可以定义一个需要实现类型的构造函数的对象安全特征?

实现泛型的 Trait 方法中的文字

我什么时候应该使用特征作为 Rust 的类型?

在线程中运行时,TCPListener(服务器)在 ip 列表中的服务器实例之前没有从客户端接受所有客户端的请求

Rust Serde 为 Option:: 创建反序列化器

为什么会出现无法移出可变引用后面的 `self.x`错误?

为什么 &i32 可以与 Rust 中的 &&i32 进行比较?

使用 `.` 将 T 转换为 &mut T?

在 Rust 中退出进程

在 Traits 函数中设置生命周期的问题

有没有办法使用 NASM 语法进行内联汇编?

如何从 Rust 中不同类型的多个部分加入 Path?