【Rust中的错误处理】

Rust中的错误处理

  • 什么是错误处理
  • Rust中的错误处理
  • 比Result<T,E>更强硬的panic!
  • 比单独调用panic更丝滑的unwrap,expect:
  • 总结


什么是错误处理

‌错误处理‌是指在编程过程中,对程序运行时出现的错误进行检测、捕获和处理的过程,以确保程序能够按照预期正常运行。
对于程序来说,一般可将错误分解为两大类,一类是因外部输入或调用方式有问题而产生的错误,一类是程序编写出现的错误问题,前者多半不会给程序带来极端的问题,而后者很有可能造成程序的崩溃等,所以编程时需要进行正确地错误处理。
C++/C#均有各自的错误处理方法,有各自的error库,并有异常处理机制,不过这都需要人为“注意”,也就是说如果你忽略了错误处理,其编译器并不会提示你这是有问题的。

Rust中的错误处理

Rust在代码规则中便支持在需要错误处理的地方,如返回值使用Result<T,E>,或者在必要时Panic!
这两个方式便可以当作一种是软处理,一种时强硬的处理方式。(Result<T,E> 会在发生错误时将错误向上抛出,Panic!则会在发生错误的时候将程序运行的线程干掉,所以这也是为什么我们鼓励不要再主线程中做太多的事情。)

代码示例:

use std::fs::File;
use std::io::{Error, Read};fn read_file(file_name: &str) -> Result<String, Error> {let mut file = File::open(file_name)?;let mut contents = String::new();file.read_to_string(&mut contents)?;Ok(contents)
}fn main() {let content = read_file("example.txt");match content {Ok(content) => println!("文件内容: {}", content),Err(error) => println!("发生错误: {:?}", error),}
}

上述代码返回值 Result<String, Error> 是一个enum,它包含了两种返回结果Ok和Error,Ok即文件读取成功,Error即失败,返回特定的error,而正确地返回值只有一个就是Ok(contents)。
在函数中,我们看到有两个【?;】为结尾的行,其 表示当错误发生时,程序便会从【?】位置将问题抛转到调用方处理

file.read_to_string(&mut contents)?//最后一行这样写可不可以?

不可以,【?】只是错误处理的语法糖,不是返回值的语法糖,也就是说你只能够在错误发生时的值而没有办法返回成功时候的OK(xxx)。

比Result<T,E>更强硬的panic!

panic多用于无法接受的程序错误,拿着一个极端错误的结果往下走逻辑时没有必要的,甚至会徒增排查问题的难度时。
代码示例:

//数组访问越界时会被动触发panic
let v = vec![1,2,3];
println!("{:?}",v[3]);
//主动调用,下面这段代码是没有意义的,只是为了展示主动调用
fn main() {panic!("boom");
}

比单独调用panic更丝滑的unwrap,expect:

unwrap当返回值正常时与Ok(xxx) or Some(xxx)无异,而当程序有异常时则直接panic线程。
代码示例:

use std::net::IpAddr;
fn main() {let _ = func();
}
fn func() -> Result<IpAddr, Box<dyn std::error::Error>> {Ok("1271".parse().unwrap())
}

很明显,以上“1271”无法转换成ip地址,此段程序将直接panic!,以下是错误输出:

thread 'main' panicked at main.rs:7:23:
called `Result::unwrap()` on an `Err` value: AddrParseError(Ip)
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

根据提示开发者可以根据栈展开深入查看问题的原因。
expect代码示例:

use std::net::IpAddr;
fn main() {let _ = func();
} //-
fn func() -> Result<IpAddr, Box<dyn std::error::Error>> {//+Ok("1271".parse().expect("cannote parse str to ipaddr")) //+
}

输出:
thread ‘main’ panicked at main.rs:7:23:
cannote parse str to ipaddr: AddrParseError(Ip)
note: run with RUST_BACKTRACE=1 environment variable to display a backtrace

多了一些问题标注信息

让我们展开看一下unwrap源码:

    #[inline(always)]#[track_caller]#[stable(feature = "rust1", since = "1.0.0")]pub fn unwrap(self) -> TwhereE: fmt::Debug,{match self {Ok(t) => t,Err(e) => unwrap_failed("called `Result::unwrap()` on an `Err` value", &e),}}
-------------------------------------------------------------------------------------------
#[cfg(not(feature = "panic_immediate_abort"))]
#[inline(never)]
#[cold]
#[track_caller]
fn unwrap_failed(msg: &str, error: &dyn fmt::Debug) -> ! {panic!("{msg}: {error:?}")
}

显而易见的,unwrap内部在unwrap_failed 调用了panic。expect亦是如此。


总结

当然在实际工程开发中我们有狠多crate可以选择,而不是简单的直接裸使用这些Error处理,通过anyhow,thisError加上tracing这样优秀的问题跟踪crate,使得我们的代码更加的具备鲁棒性,也更易于发现问题并即使解决问题。

如有勘误,敬请指出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/58737.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BGP路径属性与路由反射器

前言 IBGP水平分割规则用于防止AS内部产生环路&#xff0c;在很大程度上杜绝了IBGP路由产生环路的可能性&#xff0c;但是同时也带来了新的问题&#xff1a;BGP路由在AS内部只能传递一跳&#xff0c;如果建立IBGP对等体全互联模型又会加重设备的负担。 BGP 路径属性 AS_Path …

医学和生信web APP 平台- Appmatrix

医学&#xff08;和生信&#xff09;web APP 平台- Appmatrix 最近使用shinyproxy将平时所构建的shiny和streamlit医学类应用汇集在一起&#xff0c;实现一站式访问&#xff0c;另外&#xff0c;使用了自己电脑内网穿透&#xff0c;一定程度上缓解了数据分析类APP消耗计算资源…

Rust 力扣 - 1456. 定长子串中元音的最大数目

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们遍历长度为k的窗口&#xff0c;我们只需要记录窗口内的元音字母数量即可&#xff0c;遍历过程中刷新最大数目 题解代码 impl Solution {pub fn max_vowels(s: String, k: i32) -> i32 {let s s.as_byt…

Centos系统新增网卡后获取不到网卡的IP地址解决方法

一、问题描述 当我们给Centos系统添加了新的网卡后,使用查看IP地址命令【ip addr】时,发现新网卡没有获取到对应的IP地址信息,如下图所示: 二、解决方法 有两种解决方法:一种是自动获取IP地址;另外一种是手动配置IP地址; 2.1、自动获取IP地址 #自动获取网卡的IP地址命…

跨境卖家必备!好用的独立站建站工具推荐 !

对于跨境卖家来说&#xff0c;拥有一个独立站是拓展海外市场、提升品牌影响力的重要途径。而选择一款好用的独立站建站工具&#xff0c;则是成功搭建独立站的关键。 一、为什么跨境卖家需要独立站&#xff1f; 在跨境电商领域&#xff0c;独立站具有诸多优势。首先&#xff0c…

Android和iOS有什么区别?

Android 和 iOS 有以下区别&#xff1a; 开发者与所属公司&#xff1a; Android&#xff1a;由谷歌公司开发以及开放手机联盟维护。它是基于 Linux 内核和其他开源软件的修改版本&#xff0c;代码开源程度较高&#xff0c;许多厂商都可以基于 Android 源代码进行深度定制和开发…

Python从入门到高手7.4节-优雅的列表推导式

目录 7.4.1 什么是列表推导式&#xff1f; 7.4.2 列表推导式的基本结构 7.4.3 列表推导式的复杂结构 7.4.4 高山下的情歌 7.4.1 什么是列表推导式&#xff1f; 列表推导式&#xff0c;又叫列表解析式。所谓解析式&#xff0c;顾名思义&#xff0c;就是由已有的可迭代对象&…

Windows Qt 6安装Oracle QOCI SQL Driver插件

本文参考 QOCI for the Oracle Call Interface (OCI)。 Windows 打开 Qt 6.8.0 (MSVC 2022 64-bit)。 Setting up environment for Qt usage… Remember to call vcvarsall.bat to complete environment setup! 执行 "D:\Program Files\Microsoft Visual Studio\2022\E…

组合数计算及其性质

组合数计算示例 组合数 C 4 2 C_4^2 C42​表示从4个不同元素中选取2个元素的组合数&#xff0c;其计算公式为&#xff1a; C ( n , m ) n ! m ! ( n − m ) ! C(n,m)\frac{n!}{m!\times(n-m)!} C(n,m)m!(n−m)!n!​ 其中&#xff0c; n n n为总元素数&#xff0c; m m m为选…

书生实战营第四期-第二关python

一、任务1&#xff1a;完成Leetcode 383 1.代码 class Solution:def canConstruct(self,ransomNote: str, magazine: str) -> bool: # 创建一个字典来存储 magazine 中每个字符的出现次数 char_count {} # 遍历 magazine&#xff0c;统计每个字符的出现次数 for char…

计算机考研,选择西安交通大学还是哈工大?

C哥专业提供——计软考研院校选择分析专业课备考指南规划 经过全面分析&#xff0c;2025年考研西安交通大学和哈尔滨工业大学计算机专业的报考难度对比如下&#xff1a; 西安交通大学计算机专业 > 哈尔滨工业大学计算机专业 对于想要报考985高校计算机专业但核心目标是优…

【ShuQiHere】数据科学与人工智能必备的 Python 包大全

【ShuQiHere】&#x1f4da;&#x1f4a1; 在数据科学与人工智能的世界里&#xff0c;拥有一套强大的 Python 工具包可以让您的研究和项目事半功倍。本文将详细介绍这些必备的包&#xff0c;每个包都附有用途、特点、安装方式&#xff0c;以及实际的代码示例和学习资源&#x…

CentOS系统查看CPU、内存、操作系统等信息

Linux系统提供了一系列命令可以用来查看系统硬件信息&#xff0c;如CPU的物理个数、核数、逻辑CPU数量、内存信息和操作系统版本。 查看物理CPU、核数和逻辑CPU 在多核、多线程的系统中&#xff0c;了解物理CPU个数、每个物理CPU的核数和逻辑CPU个数至关重要。超线程技术进一步…

项目升级到.Net8.0 Autofac引发诡异的问题

前两天把项目升级到.Net8.0了&#xff0c;把.Net框架升级了&#xff0c;其他一些第三方库升级了一部分&#xff0c;升级完以后项目跑不起来了&#xff0c;报如下错误&#xff1a; An unhandled exception occurred while processing the request. DependencyResolutionExcepti…

完整了解asp.net core MVC中的数据传递

在ASP.NET Core MVC应用开发中&#xff0c;数据传递是构建高效、可靠Web应用的核心环节之一。它涵盖了从控制器到视图、不同请求之间以及与外部数据源交互等多个方面。正确掌握各种数据传递方式对于开发出性能优良、用户体验良好的应用程序至关重要。本文将全面深入地探讨ASP.N…

十八、【智能体】数据库:未来科技的大脑

在上一篇中我们讲到了 **变量 ** &#xff0c; 变量 的作用是保存用户个人信息&#xff0c;让 Bot记住用户的特征&#xff0c;使回复更加个性化。 上一篇内容为&#xff1a;https://blog.csdn.net/qq_40585384/article/details/143272599 但变量有一个缺点——存储的信息太单…

web文件包含include

php伪协议 在 PHP 中&#xff0c;伪协议&#xff08;Pseudo Protocols&#xff09; 也被称为 流包装器&#xff0c;这些伪协议以 php:// 开头&#xff0c;后面跟着一些参数&#xff0c;用于指定 要执行的操作 或 需要访问的资源。 伪协议表明这些协议并不是一个 真实的外部协议…

Diving into the STM32 HAL-----USART

如今&#xff0c;电子行业有许多串行通信协议和硬件接口可用。其中之一是通用同步/异步接收器/发射器接口&#xff0c;也简称为 USART。几乎每个微控制器都至少提供一个 UART 外设。几乎所有的 STM32 MCU 都提供至少两个 UART/USART 接口&#xff0c;但根据 MCU 封装支持的 I/O…

功能强大视频编辑软件 Movavi Video Editor Plus 2024 v24.2.0 中文特别版

Movavi Video Editor Plus中文修改版是一款功能强大的视频制作编辑软件&#xff0c;使用能够帮助用户快速从录制的素材中制作成一个精美的电影&#xff0c;支持进行视频剪辑&#xff0c;支持添加背影、音乐和各种音乐&#xff0c;软件使用简单&#xff0c;无需任何的经验和专业…

中国书画、

孙溟㠭浅析“古玺” “古玺”是秦以前印章的通称&#xff0c;远可追溯三代&#xff0c;兴盛于战国。古玺所用的文字是当时六国的篆书&#xff0c;也就是大篆&#xff0c;风格多种多样&#xff0c;变化不一&#xff0c;不容易认识。从文字形式上&#xff0c;可分阴文&#xff08…