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的结果是OK,OK中的值就是表达式的结果,然后继续执行程序;如果Result是Err,Err就是整个函数的返回值,就像使用了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对象,此处可以简单理解为:"任意可能的错误类型"。

相关推荐
jktantan5 小时前
Vue keep-alive 切标签后滚动位置回顶?因为 onDeactivated 里读到的 scrollTop 是 0
前端·javascript·vue.js
2601_962885726 小时前
quotes 字段全解:涨跌幅、振幅、换手率的口径与单位
java·前端·spring
excel6 小时前
encodeURI 和 encodeURIComponent 有什么区别?
前端
前端精髓6 小时前
调用openrouter的免费API模型
java·前端·javascript
赛博守夜人7 小时前
AI安全攻防与治理之十四:AI 安全测试不能脱离传统安全,Web、API、移动端与模型攻击面的组合拳
前端·人工智能·安全
开开心心_Every7 小时前
快速隐藏程序工具自定义快捷键一键切换
java·开发语言·前端·spring·智能手机·word·intellij-idea
networknomad7 小时前
OpenReplay:自己搭的会话回放工具,给前端排错用的
前端·其他
缓慢更新8 小时前
AI 辅助生成单测:从接口定义到用例的流水线
java·服务器·前端·网络·数据库·人工智能
陈随易9 小时前
AI 运维服务器,安全又可靠的方法
前端·后端·程序员
风骏时光牛马9 小时前
AI稳定性治理体系构建与疑难问题深度分析
前端