Rust错误处理:Result

文章目录

Rust基础教程: 初步⚙ 所有权⚙ 结构体和枚举类⚙ 函数进阶⚙ 泛型和特征⚙ 并发和线程通信⚙ cargo包管理⚙ 可空类型Option
Rust进阶教程: 用宏实现参数可变的函数⚙ 类函数宏

简介

Rust中没有提供类似try...catch之类的分支语句块,而是提供了Result这种数据类型,用于处理错误的返回值。和Option类似,Result的实质也是一种枚举类型

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

下面做一个简单的示例,用Result类型的返回值,来构造一个除法函数,并表示x/0这种问题

rust 复制代码
// res.rs
fn div_err(x:f32, y:f32) -> Result<f32, String>{
    if y==0.0{ Err("DIV BY ZERO".to_string()) } else{ Ok(x/y) }
}

fn main(){
    println!("5/3={:?}", div_err(5.0,3.0));
    println!("5/0={:?}", div_err(5.0,0.0));
}

运行结果如下

rust 复制代码
>res.exe
5/3=Ok(1.6666666)
5/0=Err("DIV BY ZERO")

Rust有一个值得注意的性质,即未处理的Result,会在编译时提出警告,比如把main函数改成下面的形式,那么编译时会给出Result必须被使用的警告。

rust 复制代码
fn main(){
    div_err(5.0,3.0);
}

错误匹配

考虑到Result的本质是枚举类型,所以其常规的处理方式,也就是使用match匹配,相应地,Result也支持un_wrap方法,当Result的返回值是Err时输出直接报错。但另一方面,Result支持多种错误的设置,所以从报错的角度来说,功能显然是更全面的。

仍以除法为例,尽管除数为0时一定要报错,但形如 x / 0 x/0 x/0和 0 / 0 0/0 0/0显然是两种不同的错误。如果为实数添加一个无穷大,那么实数域就可以映射到一个圆形上面,从而 x / 0 x/0 x/0就可以等于 ∞ \infty ∞,但 0 / 0 0/0 0/0仍然是错的。

下面就针对这两种不同的情况,为其设置错误。

rust 复制代码
fn div_err(x:f32, y:f32) -> Result<f32, String>{
    if y==0.0{
        if x==0.0{ Err("DIV ERROR".to_string())}
        else { Err("INF ERROR".to_string()) }
    } else{
        Ok(x/y)
    }
}

fn div_print(x:f32, y:f32){
    match div_err(x, y){
        Ok(res) => println!("{}/{}={}", y, x, res),
        Err(res) => println!("{}", res)
    }
}

fn main(){
    div_print(5.0, 3.0);
    div_print(5.0, 0.0);
    div_print(0.0, 0.0);
}

运行结果如下

rust 复制代码
>res.exe
3/5=1.6666666
INF ERROR
DIV ERROR
相关推荐
小蒜学长5 分钟前
在线保险服务与管理平台的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端·服务平台·在线保险
掉进电商坑三年没爬出来的东叔17 分钟前
青龙面板进阶:一个面板聚合多平台签到,所有积分自动领
java·开发语言
iCxhust29 分钟前
51单片机电力载波应用开发(七)广播通讯
c语言·开发语言·单片机·嵌入式硬件·51单片机
殷色玫瑰1 小时前
C++ STL:stack、queue、priority_queue 与容器适配器详解
java·开发语言·数据结构·c++·算法·visualstudio
Hi202402171 小时前
同一个 NMS 算子,两种语言实现:CUDA C 与 Rust 生成 LLVM IR 和 Vortex 汇编的差异
c语言·汇编·rust·gpgpu·vortex·cudac
IT方大同1 小时前
java输入输出+方法
java·开发语言·python
滕州市燕猫虎计算机科技工作室个体工商户1 小时前
《Rust程序设计》学习笔记一
开发语言·rust·学习笔记·rust程序设计
我的div丢了肿么办1 小时前
go语言中管道 channel的使用
后端·go
Harvil_2 小时前
模型点三道菜,回喂被拒 400
后端
Wang's Blog2 小时前
Java框架 SpringCloud 快速入门: 服务拆分之服务远程调用
java·开发语言·spring cloud