可恢复的错误是那些完全停止程序并不严重的错误。可以处理的错误称为可恢复错误。

它由Result 表示。 结果是枚举,由两个变体组成,即OK 和Err ,它描述了可能的错误。

OK :’T’是一种值,它在成功情况下时返回OK变量,这是一个预期的结果。

Err :’E’是一种错误,它在失败情况下时返回ERR变量,这是意想不到的结果。

Enum Result

{

OK,

Err,

}

在上面的例子中,Result是枚举类型,OK &Err 是枚举类型的变体,其中'T'和'E'是泛型类型参数。

'T'是一种值,它将在成功的情况下返回,而'E'是一种错误,它将在失败的情况下返回。

Result包含泛型类型参数,因此在成功和失败值可能不同的许多不同情况下使用标准库中定义的结果类型和函数。

下面来看一个返回Result值的简单示例:

use std::fs::File;

fn main()

{

let f:u32 = File::open("vector.txt");

}

执行上面示例代码,得到以下结果 -

在上面的示例中,Rust编译器显示该类型不匹配。 'f'是u32类型,而File::open返回Result 类型。 上面的输出显示成功值的类型是std::fs::File,错误值的类型是std::io::Error。

注意:

File::open返回类型是成功值或失败值。 如果File::open成功,则返回文件句柄,如果File::open失败,则返回错误值。 结果枚举提供此信息。

如果File::open成功,则f将具有包含文件句柄的OK变体,如果File::open失败,则f将具有包含与错误相关的信息的Err变体。

匹配表达式以处理结果变体

下面来看看一个匹配表达式的简单示例:

use std::fs::File;

fn main()

{

let f = File::open("vector.txt");

match f

{

Ok(file) => file,

Err(error) => {

panic!("There was a problem opening the file: {:?}", error)

},

};

}

执行上面示例代码,得到以下结果 -

程序说明

在上面的示例中,可以直接访问枚举变体,而无需在OK和Err变体之前使用Result::。

如果结果正常,则返回文件并将其存储在'f'变量中。 在匹配之后,可以在文件中执行读取或写入操作。

匹配对Err值起作用。 如果Result返回Error值,那么panic!运行并停止程序的执行。

出错时 Error:unwrap()结果有许多方法可以提供各种任务。 其中一种方法是unwrap()方法。 unwrap()方法是匹配表达式的快捷方法。 unwrap()方法和匹配表达式的工作方式是一样的。

如果Result值是OK变量,则unwrap()方法返回OK变量的值。

如果Result值是Err变量,那么unwrap()方法会调用panic!宏。

下面来看一个简单的示例:

use std::fs::File;

fn main()

{

File::open("hello.txt").unwrap();

}

执行上面示例代码,得到以下结果:

在上面的例子中,unwrap()方法会自动调用panic!宏显示错误信息。

Error: expect()expect()方法的行为方式与unwrap()方法相同,即两种方法都会引起panic!宏显示错误信息。

expect()和unwrap()方法之间的区别在于,错误消息作为参数传递给expect()方法,而unwrap()方法不包含任何参数。 因此,可以说expect()方法可以跟踪panic!的来源更容易。

下面看看一个简单示例 -

use std::fs::File;

fn main()

{

File::open("hello.txt").expect("Not able to find the file hello.txt");

}

执行上面示例代码,得到以下结果 -

在上面的输出中,错误消息显示在程序中指定的输出屏幕上,即“无法找到文件hello.txt”,这会更容易找到错误代码的位置。 如果包含多个unwrap()方法,那么很难找到unwrap()方法引发panic!显示所有错误消息。

传播错误

传播错误是一种将错误从一个函数转发到另一个函数的机制。 错误传播到调用函数,其中有更多信息可用,以便可以处理错误。 假设有一个名为‘a.txt’ 的文件,它包含文本“yiibai” 。想要创建一个程序来读取文件,先参考下面一个简单的例子:

use std::io;

use std::io::Read;

use std::fs::File;

fn main()

{

let a = read_username_from_file();

print!("{:?}",a);

}

fn read_username_from_file() -> Result

{

let f = File::open("a.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),

}

}

程序说明 -

read_username_from_file()函数返回Result 类型的值,其中'T'是String类型,'E'是io类型:Error。

如果函数成功,则返回一个包含String的OK值,如果函数失败,则返回Err值。

函数中首先调用File::open函数。 如果File::open函数失败,那么匹配的第二个句柄将返回Err值,如果File::open函数成功,则它将文件句柄的值存储在变量f中。

如果File::open函数成功,那么创建一个String的变量。 如果read_to_string()方法成功,则返回文件的文本,否则返回错误信息。

假设我们有一个名为‘a.text’ 的外部文件,并包含文本“yiibai” 。 因此,该程序读取文件‘a.text’ 并显示文件的内容。

传播错误的捷径:?操作符

使用?运算符减少了代码的长度。?运算符是匹配表达式的替换意味着?运算符的工作方式与匹配表达式的工作方式相同。 假设有一个名为 a.txt 的文件,它包含文本 - “yiibai”。想要创建一个程序来对该文件执行读取操作。

看看下面一个简单的例子。

use std::io;

use std::io::Read;

use std::fs::File;

fn main()

{

let a = read_username_from_file();

print!("{:?}",a);

}

fn read_username_from_file() -> Result

{

let mut f = File::open("a.txt")?;

let mut s = String::new();

f.read_to_string(&mut s)?;

Ok(s)

}

在上面的例子中,?运算符是在Result值类型之前使用。 如果Result为OK,则返回OK变体的值,如果Result为Err,则返回错误信息。

?运算符和匹配表达式的区别使用?运算符的错误通过’from’函数移动,’from’函数在标准库中的from trait中定义。

当?运算符调用’from’函数,然后此函数将错误类型转换为当前函数的返回类型中定义的错误类型。

如果没有错误发生,那么?运算符任何函数末尾的运算符返回OK的值,如果发生错误,则返回Err的值。

它使函数的实现更简单。

链方法在 ?运算符之后调用

甚至可以通过在?运算符之后使用链接方法调用来缩短程序的代码。

下面来看一个简单的例子:

use std::io;

use std::io::Read;

use std::fs::File;

fn main()

{

let a = read_username_from_file();

print!("{:?}",a);

}

fn read_username_from_file() -> Result

{

let mut s = String::new();

File::open("a.txt")?.read_to_string(&mut s)?;

Ok(s)

}

程序说明

在上面的例子中,将read_to_string()的调用链接到File::open("a.txt")?的调用结果。如果两个函数(即read_to_string()和File::open("a.txt")成功,则返回OK值,否则返回错误值。

?运算符的限制

?运算符只能在返回Result类型值的函数中使用。 ?运算符与匹配表达式的工作方式类似。 匹配表达式仅适用于Result返回类型。

下面通过一个简单的例子来理解这一点。

use std::fs::File;

fn main()

{

let f = File::open("a.txt")?;

}

¥ 我要打赏

纠错/补充

收藏

加QQ群啦,易百教程官方技术学习群

注意:建议每个人选自己的技术方向加群,同一个QQ最多限加 3 个群。

rust盖错了怎么拆除_Rust可恢复的错误相关推荐

  1. rust盖错了怎么拆除_细说Rust错误处理

    细说Rust错误处理 1. 前言 这篇文章写得比较长,全文读完大约需要15-20min,如果对Rust的错误处理不清楚或还有些许模糊的同学,请静下心来细细阅读.当读完该篇文章后,可以说对Rust的错误 ...

  2. Mac os 10.15 不可恢复的错误 SecurityAgent无法创建所要求的机制

    Mac os 10.15 不可恢复的错误 SecurityAgent无法创建所要求的机制 由于Teamviewer导致Mac 10.15出现不可恢复的错误的解决方法. https://www.maco ...

  3. 服务器注册表修复,服务器出现-由注册表引起的I/O操作发生了不可恢复的错误 的解决方法...

    昨天一台服务器的80端口突然不行了,3389虽然通,但连接不上,其它的3306和21端口都正常的.初步怀疑是系统资源不足引起的.第二天让机房检查,最后没有办法重启解决了. 服务器出现此问题: 很多使用 ...

  4. TeamViewer之坑 不可恢复的错误

    TeamViewer之坑 由于卸载TeamViewer导致securityagent无法创建所要求的机制teamviewerauthplugin:start 然后,百度和Google了一通.找到了几个 ...

  5. 我的RUST学习——【第九章 9-1】panic! 与不可恢复的错误

    突然有一天,代码出问题了,而你对此束手无策.对于这种情况,Rust 有 panic! 宏.当执行这个宏时,程序会打印出一个错误信息,展开并清理栈数据,然后接着退出.出现这种情况的场景通常是检测到一些类 ...

  6. pve rust 能拆家吗_RUST:2020年9月第四周:向上向上再向上!

    九月第四周,马上就要迎来中秋国庆八天假!昨天被什么秋天第一杯奶茶的梗弄得一愣一愣的今天刚缓过劲来本期内容依旧是围绕了下个月即将上线的电梯展开更多消息被公布,让我们进来看个痛快!RUST:2020年9月 ...

  7. rust建的怎么拆除_农民为什么建简易房?

    最近这段时间,到周围的几个村看了看,农民新建的房子差不多都是简易房.怎么出现这种状况啊?于是进行了认真的走访,大致情况是这样的. 建这样房子的基本上是老年人. 简易房子的使用期和正常房子的相比较时间肯 ...

  8. rust睡觉按键没反应_Rust 有问有答之 use 关键字

    use 是什么 use 是 Rust 编程语言的关键字.using 是 编程语言 C# 的关键字. 关键字是预定义的保留标识符,对编译器有特殊意义. using 关键字有三个主要用途: using 语 ...

  9. rust如何进枪战服_rust手机版

    <rust手机版>是款3D超高清引擎技术打造的生存建造类枪战游戏,第一人称的作战视角,庞大的世界地图,真实般的山间.河流.荒野.在这里没有方向感,没有地图,没有任何指路的标志,这个游戏还是 ...

最新文章

  1. 【专题六】虚拟化实施人才和培训的瓶颈如何解决? ——虚拟化人才逆势抢手 5项技能最关键...
  2. Buuctf(pwn) ez_pz_hackover_2016 泄露栈地址,retshellcode;调试计算
  3. 数据结构与算法:已知二叉树两种遍历序列,求第三种遍历序列
  4. 卢伟冰疑似用上Redmi K30S:今年最后一款骁龙865旗舰
  5. 32. Magento log()方法
  6. JavaScript高级程序设计读书笔记--语言基础
  7. 理解FPS游戏中的矩阵方框透视自瞄
  8. 实验3:搜索算法求解8数码问题
  9. ligerui 用html 来初始化 ligerform
  10. 怒怼外媒,为中国正名,这个《流浪地球》捧红的犹太小哥太励志了
  11. PAT乙级 1072 开学寄语
  12. 高清卫星影像DEM各个遥感卫星数据免费下载,3款软件4个网站推荐给你,从此不再为数据发愁
  13. 理解RNN、LSTM、GRU和Gradient Vanishing
  14. python dataframe dropna_在Python中使用熊猫在两个DataFrame之间进行值...
  15. java 采集新闻数据
  16. 由于不能验证所收到的数据是否可信,无法显示您想要查看的页面。建议向此网站的管理员反馈这个问题。
  17. R-quantile()
  18. 手把手教你微擎小程序模块安装配置教程
  19. 【Qt Quick聊天软件练习】二、登录界面搭建
  20. python 安卓平板_10 个可以在平板电脑上使用的 Python 编辑器 ,让编程更贴近生活!...

热门文章

  1. 解决无法获取到B站点赞数和播放量的解决办法
  2. Windows系统U盘的检测
  3. JAVA 笔记 09 代理
  4. 日语学习--- 公司介绍写法
  5. 猪猪猫.CN-WINXPSP2电脑城装机12DVD[豪华版]
  6. cb() never called!原因及解决方法
  7. 动态婚礼请帖PPT模板
  8. 迅为4412开发板一键烧写QT程序到开发板
  9. 电商平台销量查询:2023年1月牛奶乳品热门排行榜
  10. 理光有邮件服务器吗,理光Ricoh设置扫描PDF到PC和邮件教程