最新Rust错误处理简介

 更新时间:2022年11月29日 09:10:19   作者:闲鱼翻不了身  
Rust并不像C++一样使用try catch的异常机制来进行错误处理,他将错误分为可恢复错误和不可恢复错误两类,主要使用panic!宏和Result<T,E>类型来进行错误处理,这篇文章主要介绍了Rust错误处理简介,需要的朋友可以参考下

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错误处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Tauri 打开本地文件踩坑分析解决

    Tauri 打开本地文件踩坑分析解决

    这篇文章主要为大家介绍了Tauri 打开本地文件踩坑分析解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Rust 中 Mutex 的基本用法

    Rust 中 Mutex 的基本用法

    Rust 标准库中的 Mutex 结构体位于 std::sync::Mutex 中,它提供了线程安全的数据访问,Mutex 保证了在同一时间只有一个线程可以访问被锁定的数据,这篇文章主要介绍了Rust 中 Mutex 的基本用法,需要的朋友可以参考下
    2024-05-05
  • Rust中类型转换在错误处理中的应用小结

    Rust中类型转换在错误处理中的应用小结

    随着项目的进展,关于Rust的故事又翻开了新的一页,今天来到了服务器端的开发场景,发现错误处理中的错误类型转换有必要分享一下,对Rust错误处理相关知识感兴趣的朋友一起看看吧
    2023-09-09
  • 详解Rust 修改源

    详解Rust 修改源

    这篇文章主要介绍了Rust 修改源的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-01-01
  • Rust 的 into_owned() 方法实例详解

    Rust 的 into_owned() 方法实例详解

    into_owned是Rust语言中std::borrow::Cow 枚举的一个方法,into_owned确保了调用者获得数据的独立所有权,无论Cow之前是引用还是已经拥有数据,本文给大家介绍Rust 的 into_owned() 方法,感兴趣的的朋友跟随小编一起看看吧
    2024-03-03
  • 前端基于Rust实现的Wasm进行图片压缩的技术文档(实现方案)

    前端基于Rust实现的Wasm进行图片压缩的技术文档(实现方案)

    在现代Web开发中,利用Rust编写的图片压缩代码可以编译成WebAssembly(Wasm)模块,Rust的内存安全特性和Wasm的跨平台能力,使得这种方案既高效又安全,对Rust Wasm图片压缩实现方案感兴趣的朋友一起看看吧
    2024-09-09
  • 在win10上使用mingw64编译器配置Rust开发环境和idea 配置Rust 插件

    在win10上使用mingw64编译器配置Rust开发环境和idea 配置Rust 插件

    在win10上配置 Rust 开发环境(使用 mingw64编译器)和 idea 配置 Rust 插件的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-03-03
  • Rust生成随机数的项目实践

    Rust生成随机数的项目实践

    Rust标准库中并没有随机数生成器,常见的解决方案是使用rand包,本文主要介绍了Rust生成随机数的项目实践,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • rust文件读写的实现示例

    rust文件读写的实现示例

    Rust语言提供了强大的文件读写库,使得开发者可以更加方便地进行文件操作,并且其安全性可以有效避免文件操作中可能出现的风险,本文就来详细的介绍了rust文件读写的实现示例,感兴趣的可以了解一下
    2023-12-12
  • Rust文本处理快速入门

    Rust文本处理快速入门

    编程过程中有许多类型的数据要处理,其中文本处理必不可少,本文主要介绍了Rust文本处理快速入门 ,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2024-03-03

最新评论