30_result枚举与可恢复错误-上

1. 概述

通常情况下,错误都没有严重到要停止整个应用的地步。当某个函数运行失败,一般都有一些可以简单解释并做出可以做响应的原因所引起的,比如说我们程序想打开某个文件,但这个文件却不存在,这个时候通常是要创建该文件,而不是终止程序。在Rust里我们可以使用Result枚举类型,来处理可能失败的情况。该枚举类型的结构如下

Rust 复制代码
enum Result<T, E> {
    Ok(T),
    Err(E),
}

T:操作成功情况下,Ok变体里返回的数据类型 E:操作失败的情况下,Err变体里返回的错误的类型

2. 错误的处理

2.1 通常的处理方式

处理Result的一种方式:match表达式。和Option枚举一样,Result及其变体也是由prelude代码作用域。错误处理过程如下示例代码

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

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

    let f = match f {
        Ok(file) => file,
        Err(error) => {
            panic!("Error opening file {:?}", error)
        }
    };
}

2.2 匹配不同的错误

可以在match里嵌套match,如下示例代码

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

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

    let f = match f {
        Ok(file) => file,
        Err(error) => match error.kind() {
            // 文件不存在创建文件
            ErrorKind::NotFound => macth File::create("hello.txt") {
                Ok(fc) => fc,
                Err(e) => panic!("Error creating file: {:?}", e),
            },
            // 其他的错误类型,可以自定义变量名,这里叫做 other_error
            other_error => panic!("Error opening the file: {:?}", other_error),
        }
    };
}

我们可以使用unwrap_or_else方式实现以上代码实现的功能,如下示例代码

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

fn main() {
    let f = File::open("hello.txt").unwrap_or_else(|error| {
        if error.kind() == ErrorKind::NotFound {
            File::create("hello.txt").unwrap_or_else(|error| {
                panic!("Error creating file: {:?}", error);
            })
        } else {
            panic!("Error opening the file: {:?}", error);
        }
    });
}

2.3 unwrap和expect

unwrap可以被看作match表达式的一个快捷方法。如果Result的结果是OK,则返回OK的值,如果Result的结果是Err,则调用panic!宏。如下示例代码

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

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

我们还可以使用expect方法,改方法和unwrap类似,但可指定错误信息,如下示例代码

Rust 复制代码
let f = File::open("hello.txt").expect("无法打开文件");
相关推荐
kyriewen12 小时前
别再 console.log 了:5 个 Chrome DevTools 调试技巧,用过就回不去了
前端·javascript·面试
IT_陈寒14 小时前
Python搞不定字符串编码?这破玩意坑我两小时!
前端·人工智能·后端
DigitalOcean15 小时前
Laravel 开发者已在 DigitalOcean 上开通超过 10 万台服务器
前端·laravel
星始流年15 小时前
从 Tool 到 Skill——基于 LangChain 的服务端Skill实现
前端·langchain·agent
李惟15 小时前
开源本地通信库,纯客户端 RPC,像聊天一样通信
前端
YAwu1115 小时前
深入解析 React 炫彩鼠标跟随标题组件:从坐标定位到动画性能
前端·react.js
GuWenyue15 小时前
排序效率低?5分钟吃透快速排序,性能飙升至O(nlogn)
前端·javascript·面试
OpenTiny社区15 小时前
🎨 看完 GenUI SDK 源码我悟了!
前端·vue.js·github
叁两15 小时前
前端转型AI Agent该如何学习?(前置篇)
前端·人工智能·node.js
何时梦醒15 小时前
深入理解递归与快速排序 —— 从基础入门到手写实现
前端·javascript