31.错误处理.rs
/*
程序中一般会出现两种错误:可恢复错误和不可恢复错误
可恢复错误:可恢复错误的典型案例是文件访问错误,如果访问一个文件失败,有可能是因为它正在被占用,是正常的,我们可以通过等待来解决
不可恢复错误:由编程中无法解决的逻辑错误导致的,例如访问数组末尾以外的位置
对于可恢复错误用 Result<T, E> 类来处理,对于不可恢复错误使用 panic! 宏来处理。
enum Result<T, E> {Ok(T),Err(E),
}
在 Rust 标准库中可能产生异常的函数的返回值都是 Result 类型的*/use std::fs::File;
use std::io;
use std::io::Read;fn main() {//不可恢复错误用法://panic!("error occured");let f = File::open("hello.txt");match f {Ok(file) => {println!("File opened successfully.");}Err(err) => {println!("Failed to open the file.");}}//如果想使一个可恢复错误按不可恢复错误处理,Result 类提供了两个办法:unwrap() 和 expect(message: &str) ://两者的区别在于 expect 能够向 panic! 宏发送一段指定的错误信息。let f1 = File::open("hello.txt").unwrap();let f2 = File::open("hello.txt").expect("Failed to open.");//测试方法1let r = myerro(-10000);if let Ok(v) = r {println!("Ok: f(-1) = {}", v);} else {println!("Err");}//测试方法2println!("{:?}", call_myerro(-101));//测试方法3println!("{:?}", call_myerro2(101));catch_ifreadfile_err();
}//自定义错误
fn myerro(i: i32) -> Result<i32, bool> {if i >= 0 {Ok(i)} else {Err(false)}
}//测试-自定义错误
fn call_myerro(i: i32) -> Result<i32, bool> {let t = myerro(i);return match t {Ok(i) => Ok(i),Err(b) => Err(b),};
}//call_myerro写有些冗长,Rust 中可以在 Result 对象后添加 ? 操作符将同类的 Err 直接传递出去.
//? 符的实际作用是将 Result 类非异常的值直接取出,如果有异常就将异常 Result 返回出去。所以,?
//符仅用于返回值类型为 Result<T, E> 的函数,其中 E 类型必须和 ? 所处理的 Result 的 E 类型一致
fn call_myerro2(i: i32) -> Result<i32, bool> {let t = myerro(i)?;Ok(t)
}//获取 Err 类型的函数是 kind().实现try catch
//Rust 似乎没有像 try 块一样可以令任何位置发生的同类异常都直接得到相同的解决的语法,但这样并不意味
//着 Rust 实现不了:我们完全可以把 try 块在独立的函数中实现,将所有的异常都传递出去解决fn read_text_from_file(path: &str) -> Result<String, io::Error> {let mut f = File::open(path)?;let mut s = String::new();f.read_to_string(&mut s)?;Ok(s)
}fn catch_ifreadfile_err() {let str_file = read_text_from_file("hello2.txt");match str_file {Ok(s) => println!("{}", s),Err(e) => match e.kind() {io::ErrorKind::NotFound => {println!("No such file");}_ => {println!("Cannot read the file");}},}
}
31.错误处理.rs相关推荐
- Rust学习资料大全
2021年接触了区块链,接触了波卡,接触了rust,接触了一个全新的世界,愿自己可以有一个好的发展,加油!!!rust语言是一门新兴起的编程语言,作为一个编程爱好者很想把他学精学透.但是一门编程语言没 ...
- 群聊:项目级的错误处理
CFANS·镇宅神兽(58135482) 17:44:35 说到错误处理,路神 CFANS·镇宅神兽(58135482) 17:44:46 我最近一直在想这个东西 非常路<luzte@qq.co ...
- asp程序错误详细说明例表
asp程序错误详细说明例表 字体大小: 大 中 小 来源: CSDN 时间: 2005-2-17 14:23:07 平时写程序的时候出错时的解决方法,不太全,但是一般问题应该都有了,呵呵,欢迎大加添加 ...
- CentOS 6.0安装ipvsadm 1.26错误笔录
CentOS 6.0安装ipvsadm 1.26错误笔记 ipvsadm 1.26适用于kernel 2.6.28及之后的内核版本, 在安装ipvsadm 1.26之前先安装依赖包,不然会报错如下: ...
- Microsoft VBScript 编译器错误 错误原因 代码大全
Microsoft VBScript 编译器错误 错误 '' 缺少语句 ActiveServerPages,ASP0126(0x80004005)-->找不到包含文件 MicrosoftOLED ...
- 错误:readline/readline.h:没有那个文件或目录解决方法
make linux 在包含自 lua.h:16 的文件中, 从 lua.c:15: luaconf.h:275:31: 错误:readline/readline.h:没有那个文件或目录 luacon ...
- Mysql连接错误:Mysql Host is blocked because of many connection errors
环境:linux,mysql5.5.31错误:Host is blocked because of many connection errors; unblock with 'mysqladmin f ...
- mysql dlz驱动,安装wddns3 /dlz_mysql_driver.c:76:19: 错误:mysql.h:没有那个文件或目录...
安装wddns3 运行wddns3_install.sh 出错 请问安装脚本中: ./configure --prefix=/www/wdlinux/bind \ --enable-threads \ ...
- ELK 收集中断错误处理
ELK收集中断,定位问题到redis发现redis内存不足,所以迁移到新的redis上 elasticsearch 删除索引语句: curl -XDELETE http://localhost:920 ...
最新文章
- mysql longtext可以存储多少文字_MySQL 四万字精华总结 + 面试100 问,和面试官扯皮绰绰有余(收藏系列)
- html5 响应式布局
- 【Android 应用开发】Android资源文件 - 使用资源存储字符串 颜色 尺寸 整型 布尔值 数组
- 一起玩树莓派3+手把手带您入门树莓派(3000字+超详细图解版)
- key to ribbon chart in powerbi: time, category, value
- struts2自动接收表单数据
- Flink SQL Client读Kafka+流计算(DDL方式+代碼嵌入DDL/SQL方式)
- bash3与bash4数组结构
- js获取当前月的第一天和最后一天
- 会计的思考(17):还原会计报表的企业个性之一
- Java文件– java.nio.file.Files类
- python画猫咪老师_简笔画教程:教你画猫咪老师
- 树莓派:树莓派的各个引脚
- MySQL中的外连接和内连接
- 【Burp suite】intruder内的四种攻击模式(attack type)分析!
- 扰动观察法怎么写matlab,扰动观察法
- 谷歌浏览器如何正确安装第三方已被停用的扩展插件
- 淘宝运营 淘宝补流量的作用 如何安全补单
- 老贾笔记--轻轻松松oracle之logmnr篇[吃顿饭的功夫学恢复误删除(delete)的数据]
- Android的RemoteViews