最新Rust错误处理简介

目录
  • Rust错误处理简介
  • panic!
  • Result
  • 传播错误
  • 错误处理指导原则

Rust错误处理简介

以下内容总结自 《The Rust Programing Language》

Rust并不像C++一样使用try catch的异常机制来进行错误处理,他将错误分为可恢复错误和不可恢复错误两类,主要使用panic!宏和Result<T,E>类型来进行错误处理。

panic!

panic!用于处理不可恢复的错误(例如类似c中的段错误)。当出现 panic 时,程序默认会开始 展开(unwinding),这意味着 Rust 会回溯栈并清理它遇到的每 一个函数的数据。

fn main() {
	panic!("crash and burn");
    //打印crash ang burn并清理程序栈,
    //若指定panic = 'abort'则,直接中止程序,清理工作交给操作系统
}

Result

Result用于处理可恢复的错误(例如文件打开失败)。

//T 代表成功时返回的 Ok 成员中的数据的类型
//E 代表失败时返回的 Err 成员中的错误的类型。
enum Result<T, E> {
	Ok(T),
	Err(E),
}

//一个简单的使用Result的例子
use std::fs::File;
use std::io::ErrorKind;
fn main() {
	let f = File::open("hello.txt");
	let f = match f {
		Ok(file) => file,
		Err(error) => match error.kind() {
			ErrorKind::NotFound => match File::create("hello.txt") {
				Ok(fc) => fc,
				Err(e) => panic!("Problem creating the file: {:?}", e),
			},
			other_error => {
			panic!("Problem opening the file: {:?}", other_error)
			}
		},
	};
}

//Result失败时调用panic的简写:unwrap和expect
//如果 Result 值是成员 Ok,unwrap 会返回 Ok 中的值。如果 Result 是成员 Err,unwrap 会为我们调用 panic!。
//expect同理
fn main() {
	let f = File::open("hello.txt").unwrap();
    let f = File::open("hello.txt").expect("Failed to open hello.txt");
}

传播错误

当编写一个其实先会调用一些可能会失败的操作的函数时,除了在这个函数中处理错误外,还可以选择 让调用者知道这个错误并决定该如何处理。这被称为 传播(propagating)错误。(即在函数中向上层返回错误,交由上层处理),除常规的return Err外,Rust还提供了?语法糖来编写传播错误代码。

//常规return Err方式此处从略,下面展示?语法
use std::fs::File;
use std::io;
use std::io::Read;
//File :: open 调用结尾的 ? 将会把 Ok 中的值返回给变量 f。如果出现了错误,
//? 运算符会提早返回整个函数并将一些 Err 值传播给调用者。同理也适用于 read_to_string 调用结尾的 ?。
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)
}
//甚至可以这样链式调用
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)
}

注意:

? 运算符只能被用于返回值与 ? 作用的值相兼容的函数,所以说对Option或其他类型,如果需要?语法同样适用

错误处理指导原则

对于何时适用panic何时适用Result,官方给出了如下指导原则:

在当有可能会导致有害状态的情况下建议使用 panic! —— 在这里,有害状态是指当一些假设、保证、协 议或不可变性被打破的状态,例如无效的值、自相矛盾的值或者被传递了不存在的值 —— 外加如下几种 情况:

• 有害状态是非预期的行为,与偶尔会发生的行为相对,比如用户输入了错误格式的数据。

• 在此之后代码的运行依赖于不处于这种有害状态,而不是在每一步都检查是否有问题。

• 没有可行的手段来将有害状态信息编码进所使用的类型中的情况

然而当错误预期会出现时,返回 Result 仍要比调用 panic! 更为合适。这样的例子包括解析器接收到格式 错误的数据,或者 HTTP 请求返回了一个表明触发了限流的状态。在这些例子中,应该通过返回 Result 来表明失败预期是可能的,这样将有害状态向上传播,调用者就可以决定该如何处理这个问题。

当代码对值进行操作时,应该首先验证值是有效的,并在其无效时 panic!。

到此这篇关于Rust错误处理简介的文章就介绍到这了,更多相关Rust错误处理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 关于Rust编译时报link.exe not found错误问题

    我在Windows 7上面配置Rust运行环境的时候报了下面的错误,差点导致我去装Windows11或者换Linux... 这个Windows7真是让人头疼,各种组件都是缺失的,要我一个一个安装,缺少各种dll,NET.flamework就弄了半天...... VisualStudioCode直接打不开 废话不多说,展示一下报错内容 C:\rustspace>rustc main.rserror: linker `link.exe` not found|= note: 系统找不到指定的文件. (

  • Rust使用kind进行异常处理(错误的分类与传递|)

    目录 前言 1.1.panic! 宏的使用 1.2.通过 Powershell命令行分析错误原因 2.可恢复的错误 2.1.Rustlt<T,E>枚举类的使用 2.2.Result 类的unwrap() 和 expect(message: &str) 方法 3.可恢复的错误的传递 4.结合kind方法处理异常 前言 Rust 有一套独特的处理异常情况的机制,它并不像其它语言中的 try 机制那样简单.在Rust 中的错误分为两大类:可恢复错误和不可恢复错误.大多数编程语言用 Excep

  • 最新Rust错误处理简介

    目录 Rust错误处理简介 panic! Result 传播错误 错误处理指导原则 Rust错误处理简介 以下内容总结自 <The Rust Programing Language> Rust并不像C++一样使用try catch的异常机制来进行错误处理,他将错误分为可恢复错误和不可恢复错误两类,主要使用panic!宏和Result<T,E>类型来进行错误处理. panic! panic!用于处理不可恢复的错误(例如类似c中的段错误).当出现 panic 时,程序默认会开始 展开(

  • 2022最新Rust变量与数据类型讲解

    目录 变量与数据类型 变量和可变性 变量声明 变量命名 变量的可变性 变量遮蔽 常量 基本数据类型 整数类型 浮点数类型 布尔类型 字符类型 范围类型 复合数据类型 元组类型 数组类型 结构体类型 枚举类型 无参枚举类型 带参枚举类型 容器类型 Vec VecDeque HashMap 字符串 创建 修改 字符串的访问 字面量和运算符 字面量 运算符 变量与数据类型 常用的三大数据结构: 动态数组 映射 字符串 Rust标准库std::collections提供了4种通用的容器类型,其中包含8种

  • ASP.NET缓存管理的几种方法

    尽管缓存管理在Windows应用程序中已经不再是个问题,但在web环境下依然是个挑战.因为HTTP是一个无状态的协议并且web服务无法识别不同请求的用户.识别不同的请求究竟是哪个特定用户发出的,并且存储这些信息以便它在以后请求中能被重新使用,对我们来说非常重要.ASP.NET提供了很多特性用来在客户端和服务器端存储这些数据,但是有时我们会对"我们什么时候使用它们(哪个)"感到疑惑.在ASP.NET中,我们会遇到像Session,Application以及Cache这些对象,为了有效地在

  • PHP和Mysqlweb应用开发核心技术-第1部分 Php基础-2 php语言介绍

    主要主题是 .php字符串中的变量扩展系统 .php中可用的更多数据类型 .类型之间的转换 .输入和使用变量和常量 .如何在php中构建表达式以及构建表达式所需的操作符 .使用语言中可用的控制结构 .1 输入字符串的更多介绍 复制代码 代码如下: <?php $hour = 16; $kilometres = 4; $content = "cookie"; echo " 4pm in 24 hour time is {$hour}00 hours.<br/>

  • 解决tensorflow1.x版本加载saver.restore目录报错的问题

    这个错误是最新的错误哈,目前只在tensorflow上的github仓库上面有提出,所以你在百度上面找不到. 是个tensorflow的bug十天前提出的,只有github仓库上一个地方有提出. NotFoundError (see above for traceback): Unsuccessful TensorSliceReader constructor: Failed to find any matching files for xxx Traceback (most recent ca

  • springboot+swagger2.10.5+mybatis-plus 入门详解

    最新idea2020安装部署超详细教程 懂得懂的 2020.3 2020.2.4 2020.2.3 2020.2.2 20.2.1 2019.3 2018.3 最新2020永久 springboot简介: 个人对springboot的一点小的理解: 1.最大优势:简化配置 区别于传统的 MVC 模式,对于配置进行了大量的简化,魔鬼注解:SpringBootApplication 中包含了的注解 @SpringBootConfiguration @EnableAutoConfiguration @

  • springboot集成tkmapper及基本使用教程

    目录 一. 简介 二.集成mybatis&tkmapper 2.1.所需依赖 2.2.配置yml 2.3.主启动类上加注解扫描 三.基本使用 3.1.创建BaseMapper接口 3.2.entity实体层 3.3.mapper持久层 3.4.service服务层 四.测试 五.注意: 参考资料 SpringBoot使用tkmapper 1.加载依赖 2.引入逆向工程的插件 3.插件配置文件 4.错误 一. 简介 tkMapper是⼀个MyBatis插件,是在MyBatis的基础上提供了很多工具

  • 2016最新CocoaPods安装和错误解决方案

    CocoaPods是什么? CocoaPods是一个负责管理iOS项目中第三方开源库的工具.CocoaPods的项目源码在Github上管理.该项目开始于2011年8月12日,在这两年多的时间里,它持续保持活跃更新.开发iOS项目不可避免地要使用第三方开源库,CocoaPods的出现使得我们可以节省设置和更新第三方开源库的时间,在iOS开发中经常会用到第三方库如AFNetworking,ASIHttpRequest等,在使用第三方库时,你除了要导数源码外,但是,集成这些依赖库需要我们手动去配置,

  • 简介JavaScript错误处理机制

    1. try-catch语句 ECMA-262第3版引入了try-catch语句,作为JavaScript中处理异常的一种标准方式. 语法: try{ // 可能会导致错误的代码 }catch (error){ // 在错误发生时怎么处理 } 也就是说,我们应该把所有可能会抛出错误的代码都放在try语句块中,而把那些用于错误处理代码放在catch块中. try-catch语句的逻辑是:如果try块中的任何代码发生了错误,就会立即退出代码执行过程,然后接着执行catch块.此时,catch块会接收

随机推荐