31_result枚举与可恢复错误-下

1. 错误传播

我们除了在函数出处处理错误;还可以将错误返回给函数的调用者,让调用者进一步进一步处理错误,这个过程就叫做错误传播。如下示例代码

Rust 复制代码
use std::fs::File;
use std::io;
use std::io::Read;

fn read_username_from_file() -> Result<String, io::Error> {
    let f = File::open("hello.txt");

    let mut f = match f {
        Ok(file) => file,
        Err(e) => return Err(e)
    };

    let mut s = String::new();
    match f.read_to_string(&mut s) {
        Ok(_) => Ok(s),
        Err(e) => Err(e)
    }
}

fn main() {
    let result = read_username_from_file();
}

2. ?运算符

2.1 ?运算符的使用

?运算符是传播错误的一种快捷方式。如果Result的结果是OKOK中的值就是表达式的结果,然后继续执行程序;如果ResultErrErr就是整个函数的返回值,就像使用了return

函数可以简写如下

rust 复制代码
fn read_username_from_file() -> Result<String, io::Error> {
    let mut f = File::open("hello.txt")?;

    let mut s = String::new();
    f.read_to_string(&mut s)?;
    Ok(s)
}

2.2 ?与from

Trait std::convert::From上的from函数,用于错误之间的转换。

?所应用的错误,会隐式的被from函数处理,当?调用from函数时,它所接收的错误类型会被转化为当前函数返回类型所定义的错误类型。

这种情况用于:针对不同错误类型,返回同一种错误类型。只要相关的错误类型实现了转换为所返回的错误类型的from函数,就可以被转换为返回的错误类型。如同2.1中的示例。

我们可以把2.1中的代码改为链式调用,如下内容

Rust 复制代码
fn read_username_from_file() -> Result<String, io::Error> {
    let mut s = String::new();
    File::open("hello.txt")?.read_to_string(&mut s)?;
    Ok(s)
}

2.3 ?运算符只能用于返回Result的函数

如果我们直接在main使用?运算符,如下代码,将会报错

Rust 复制代码
use std::fs::File;

fn main() {
    let f = File::open("hello.txt")?;
}

此时的main函数返回单元类型(),相当于什么都没返回,因此会报错。我们可以修改函数如下

rust 复制代码
use std::error::Error;
use std::fs::File;

fn main() -> Result<(), Box<dyn Error>>{
    let f = File::open("hello.txt")?;
    Ok(())
}

此时main函数返回一个Result枚举,编辑将不会报错。枚举的变体为单元类型()或者Box<dyn Error>Box<dyn Error>是一个trait对象,此处可以简单理解为:"任意可能的错误类型"。

相关推荐
李伟_Li慢慢13 小时前
02-从硬件说起WebGL
前端·three.js
花褪残红青杏小13 小时前
Rust图像处理第18节-分形画布缩放 + 拖拽交互:图像缩放 + f32 性能优化
rust·webassembly·图形学
kyriewen14 小时前
看了微软几万人用AI编程的数据——效率涨24%的代价没人提
前端·ai编程·claude
2601_9637713714 小时前
How to Scale Your WordPress Store Traffic in 2026
前端·php·plugin
亿元程序员14 小时前
老板说我的3D箭头游戏用来做试玩太普通了,没人想玩,让我变点花样...
前端
doiito14 小时前
【开源项目】用 Rust 重构中文 TTS!kokoroi-rs 高性能语音合成引擎介绍
ai·rust
李伟_Li慢慢15 小时前
01-threejs架构原理-课程简介
前端·three.js
铅笔侠_小龙虾15 小时前
Rust 学习目录
开发语言·学习·rust
_瑞16 小时前
深入理解 iOS 渲染原理
前端·ios
IT_陈寒16 小时前
SpringBoot自动配置失灵?你可能忘了这个关键注解
前端·人工智能·后端