std1.97.1——error模块总览
目录0. 引言1. 错误处理1.1 Panic接口1.2 将错误转换成panic1.3 expect消息风格2. Error trait(重点)2.1 错误来源2.2 source2.3.0 impl dyn Trait(标准库里提了但是没有地方讲过)2.3.1 impl dyn Error/impl dyn Error Send/impl dyn Error Send Sync参考0. 引言重点只有Error trait其他都是归属于别的模块属于交叉部分用于处理错误的接口。1. 错误处理Rust提供了两套互补的系统用于构造/表示、报告、传播、响应和丢弃错误。第一套是panic运行时和接口——最常用于表示程序中检测到的bug。第二套是Result、Error trait和用户自定义类型——用于表示程序中可预见的运行时失败模式。1.1 Panic接口以下是panic系统的主要接口以及其覆盖的职责panic!和panic_any(构造、自动传播)set_hook、take_hook和PanicHookInfo(报告)#[panic_handler]和PanicInfo(no_std下的报告)catch_unwind和resume_unwind(丢弃传播); 以下是错误系统的主要接口及其覆盖的职责Result(传播响应)Error trait(报告)用户自定义类型(构造/表示)match和downcast(响应)问号运算符?(传播)部分稳定的Try trait(传播构造)Termination(报告)1.2 将错误转换成panicpanic系统和错误系统并非完全独立。某个错误在API层面是可预见的运行时失败但对调用者而言可能代表一个bug。针对这类情况标准库提供了以Error作为来源构造panic的APIResult::unwrapResult::expect这两个函数功能等价当Result为Ok时返回内部值为Err时panic并将内部错误作为来源打印。唯一的区别是expect允许你提供一条panic错误信息与来源一同打印unwrap使用默认信息仅说明你unwrap了一个Err。两者中通常更推荐expect因为它的msg参数让你能表达意图和假设使追踪panic来源更容易。unwrap则适用于能轻松证明代码不会panic的场景或早期原型开发阶段。1.3 expect消息风格在编写expect消息时有两种常见风格用消息向遇到panic的用户呈现信息或用消息向调试panic的开发者呈现信息。前者用expect描述已发生的、被视为bug的错误// 读取环境变量不存在则panicletpathstd::env::var(IMPORTANT_PATH).unwrap()将上面的例子用expect改写msg中描述错误信息letpathstd::env::var(IMPORTANT_PATH).expect(env variable IMPORTANT_PATH is not set);将msg描述错误信息改为msg描述前置条件描述预期Result为Ok的理由letpathstd::env::var(IMPORAT_PATH).expect(env variable IMPORTANT_PATH should be set by wrapper_script.sh);expect作为错误信息与标准panic hook的默认输出配合不佳往往会重复被unwrap的来源错误已经传达的信息thread main panicked at src/main.rs:4:6 env variable IMPORTANT_PATH is not set: NotPresentexpect作为前置条件则聚焦于源码可读性在panic专门用于表示bug的场景下更容易理解出了什么问题。此外通过以应该发生什么来框定expect我们引入了独立于来源错误的新信息thread main panicked at src/main.rs:4:6: env variable IMPORTANT_PATH should be set by wrapper_script.sh: NotPresent2. Error trait(重点)pubtraitError:DebugDisplay{fnsource(self)-Option(dynErrorstatic){...}}Error是一个trait表示对错误值的基本期望即ResultT, E中E类型的值。实现Error之前必须先实现Debug和Display trait(参考std::fmt模块总览)。错误消息通常是简洁的小写句子不带结尾标点fnmain(){leterrNaN.parse::u32().unwrap_err();println!({},err.to_string());}2.1 错误来源错误可以提供原因信息。Error::source()通常在错误跨抽象边界时使用。如果某个模块必须报告一个由更低层模块的错误导致的错误它可以通过Error::source()来允许访问那个底层错误。这使得高层模块既能提供自己的错误信息同时也能在调试时揭示部分实现细节。在包装了底层错误的错误类型中底层错误应该要么通过外层错误的Error::source()返回要么通过外层错误的Display实现来渲染但不应两者兼有。2.2 source方法签名fnsource(self)-Option(dynErrorstatic)返回此错误的底层来源(如果有)。底层来源必须是实现了Error trait的类型且为’static的即不持有任何非’static的引用。usestd::error::Error;usestd::fmt;#[derive(Debug)]structSuperError{source:SuperErrorSideKick,}implfmt::DisplayforSuperError{fnfmt(self,f:mutfmt::Formatter_)-fmt::Result{write!(f,SuperError is here!)}}implErrorforSuperError{fnsource(self)-Option(dynErrorstatic){Some(self.source)}}#[derive(Debug)]structSuperErrorSideKick;implfmt::DisplayforSuperErrorSideKick{fnfmt(self,f:mutfmt::Formatter_)-fmt::Result{write!(f,SuperErrorSideKick is here!)}}implErrorforSuperErrorSideKick{}fnget_super_error()-Result(),SuperError{Err(SuperError{source:SuperErrorSideKick})}fnmain(){matchget_super_error(){Err(e){println!(Error: {e});println!(Caused by: {},e.source().unwrap());}_println!(No error),}}2.3.0 impl dyn Trait(标准库里提了但是没有地方讲过)dyn Trait本身是一个类型impl dyn Trait就是为这个类型定义固有方法。这些方法只附着在trait object上具体类型和trait本身都不受影响。标准库用这个语法为dyn Error和dyn Any提供了向下转型能力(is、downcast_ref、downcast_mut)让你在类型被擦除后能判断或恢复具体类型。2.3.1 impl dyn Error/impl dyn Error Send/impl dyn Error Send Sync三者是不同的类型各有实现。dyn Error Send和dyn Error Send Sync只是转发到dyn Error上定义的方法存在的原因是不同约束的trait object是不同类型。泛型参数T的约束是必须实现Error trait且为’static的。方法作用is::T()判断内部值是否为错误类型Tdowncast_ref::T()尝试获取错误类型T的引用返回OptionTdowncast_mut::T()尝试获取错误类型T的可变引用返回Optionmut Tdowncast::T()尝试将Boxdyn Error/Boxdyn Error Send/BoxError Send Sync转为BoxT返回ResultBoxT, Boxdyn Error/dyn Error Send/dyn Error Send Sync参考1、Rust std::error

相关新闻

Burp Suite 中文汉化完整指南:4 步把界面变成母语,零改动直接上手

Burp Suite 中文汉化完整指南:4 步把界面变成母语,零改动直接上手

Burp Suite 中文汉化完整指南:4 步把界面变成母语,零改动直接上手 【免费下载链接】BurpSuiteCN-Release BurpSuite汉化发布 项目地址: https://gitcode.com/gh_mirrors/bu/BurpSuiteCN-Release BurpSuiteCN-Release 是一个 Burp Suite 中文汉化发布项目,通过 Java Age…

2026/8/22 17:44:06 阅读更多 →
3步做出第一块小米表盘:Mi-Create零代码上手教程

3步做出第一块小米表盘:Mi-Create零代码上手教程

3步做出第一块小米表盘:Mi-Create零代码上手教程 【免费下载链接】Mi-Create Unofficial watchface creator for Xiaomi wearables ~2021 and above 项目地址: https://gitcode.com/gh_mirrors/mi/Mi-Create Mi-Create 是一款面向小米穿戴设备(20…

2026/8/22 17:44:06 阅读更多 →
基于Three.js与Git的代码仓库3D可视化:构建可交互的代码城市

基于Three.js与Git的代码仓库3D可视化:构建可交互的代码城市

1. 项目概述:当代码仓库变成一座3D城市代码看腻了,这大概是每个开发者都曾有过的感受。面对满屏的字符、层层嵌套的目录和冰冷的提交记录,我们与代码仓库的互动,似乎永远隔着一层名为“抽象”的毛玻璃。有没有一种方式&#xff0c…

2026/8/23 17:51:11 阅读更多 →

最新新闻

智能体预测新范式:自适应因子记忆如何让AI动态导航未来

智能体预测新范式:自适应因子记忆如何让AI动态导航未来

1. 项目概述:当智能体需要“预测未来”时,我们缺了什么? 在AI代理(Agent)技术日益成为自动化决策核心的今天,我们赋予它们的能力越来越复杂:从执行预设指令,到理解自然语言&#xff…

2026/8/23 20:18:33 阅读更多 →
JavaScript迭代器协议深度解析:从for...of到异步迭代与生成器实战

JavaScript迭代器协议深度解析:从for...of到异步迭代与生成器实战

1. 从“迭代”到“迭代器”:一个被误解的核心概念很多刚接触编程的朋友,一听到“迭代器”(Iterator),第一反应可能就是“哦,循环嘛”。我以前也这么想,直到在项目里踩了几个大坑才明白&#xff…

2026/8/23 20:18:33 阅读更多 →
大模型核心技术解析与AI求职实战指南

大模型核心技术解析与AI求职实战指南

1. 大模型时代的行业变革与机遇 2023年被称为"大模型元年",全球科技巨头和创业公司纷纷投入这场AI军备竞赛。根据斯坦福AI指数报告,大模型相关投资在过去一年增长了近300%,而头部企业的相关岗位薪资涨幅达到45%。这个领域正在经历从…

2026/8/23 20:18:33 阅读更多 →
让AI学会物理规律:视频世界模型的外推能力与实现方法

让AI学会物理规律:视频世界模型的外推能力与实现方法

最近在跟进计算机视觉领域的前沿研究时,发现一个很有意思的挑战:很多视频预测模型在训练集上表现惊艳,但一旦遇到训练时没见过的场景或物体运动,预测结果就变得“反物理”,比如物体凭空消失、穿透墙壁或者违反能量守恒…

2026/8/23 20:18:33 阅读更多 →
美赛论文算法总结:从逻辑构建到可视化呈现的实战指南

美赛论文算法总结:从逻辑构建到可视化呈现的实战指南

1. 从“交作业”到“拿奖”:美赛论文算法总结的核心价值每年一月底到二月初,全球数万支队伍都会经历一场为期四天四夜的“头脑风暴”——美国大学生数学建模竞赛。对于很多同学来说,美赛的挑战不仅在于解题,更在于如何将复杂的思路…

2026/8/23 20:18:33 阅读更多 →
蒙特卡罗模拟:从核心原理到数学建模实战

蒙特卡罗模拟:从核心原理到数学建模实战

1. 从“赌场”到“实验室”:蒙特卡罗模拟的起源与核心思想我第一次接触蒙特卡罗模拟,是在一个关于核反应堆中子扩散的经典案例里。当时我就在想,这么高大上的物理问题,怎么就用上了以赌城命名的数学方法?后来才明白&am…

2026/8/23 20:17:32 阅读更多 →

日新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/23 0:00:50 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/23 0:00:50 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/23 0:00:50 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/23 0:00:50 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/23 0:00:50 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/23 0:00:50 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/23 18:47:06 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/23 12:10:44 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/22 3:22:48 阅读更多 →