【Rust自学】12.8. 将错误信息写入到标准错误
12.8 将错误信息写入到标准错误12.8.0. 写在正文之前第12章要做一个实例的项目——一个命令行程序。这个程序是一个grep(Global Regular Expression Print)是一个全局正则搜索和输出的工具。它的功能是在指定的文件中搜索出指定的文字。这个项目分为这么几步- 接收命令行参数- 读取文件- 重构改进模块和错误处理- 使用TDD测试驱动开发开发库功能- 使用环境变量-将错误信息写入标准错误而不是标准输出本文12.8.1. 回顾以下是截止到上一篇文章为止所写出的全部代码。lib.rs:use std::error::Error; use std::fs; pub struct Config { pub query: String, pub filename: String, pub case_sensitive: bool, } impl Config { pub fn new(args: [String]) - ResultConfig, static str { if args.len() 3 { return Err(not enough arguments); } let query args[1].clone(); let filename args[2].clone(); let case_sensitive std::env::var(IGNORE_CASE).is_err(); Ok(Config { query, filename, case_sensitive, }) } } pub fn run(config: Config) - Result(), Boxdyn Error { let contents fs::read_to_string(config.filename)?; let results if config.case_sensitive { search(config.query, contents) } else { search_case_insensitive(config.query, contents) }; for line in results { println!({}, line); } Ok(()) } pub fn searcha(query: str, contents: a str) - Veca str { let mut results Vec::new(); for line in contents.lines() { if line.contains(query) { results.push(line); } } results } pub fn search_case_insensitivea(query: str, contents: a str) - Veca str { let mut results Vec::new(); let query query.to_lowercase(); for line in contents.lines() { if line.to_lowercase().contains(query) { results.push(line); } } results } #[cfg(test)] mod tests { use super::*; #[test] fn case_sensitive() { let query duct; let contents \ Rust: safe, fast, productive. Pick three. Duct tape.; assert_eq!(vec![safe, fast, productive.], search(query, contents)); } #[test] fn case_insensitive() { let query rUsT; let contents \ Rust: safe, fast, productive. Pick three. Trust me.; assert_eq!( vec![Rust:, Trust me.], search_case_insensitive(query, contents) ); } }main.rs:use std::env; use std::process; use minigrep::Config; fn main() { let args: VecString env::args().collect(); let config Config::new(args).unwrap_or_else(|err| { println!(Problem parsing arguments: {}, err); process::exit(1); }); if let Err(e) minigrep::run(config) { println!(Application error: {}, e); process::exit(1); } }12.8.2. 标准输出 vs. 标准错误这个代码目前把所有的信息包括错误信息都打印到终端上了而大多数的终端它都提供两种输出标准输出(stdout)和标准错误(stderr)。一般的信息应该输出到标准输出里而错误信息应该输出到标准错误里。这种区分的好处在于使正常的输出重定向到文件里面而错误信息可以在屏幕上打印。println!这个宏只能将信息打印到标准输出里。而eprintln!这个宏可以把信息输出到标准错误里。我们使用目前的代码在终端中执行这个命令:cargo run output.txt也就是把输出重定向到output.txt里但是这个指令没有带参数也就是说程序应该会报错但由于我们把错误信息也写在标准输出里所以说报错的信息被写在output.txt里了。更好的做法是将错误信息打印到标准错误里这样就可以让标准输出的内容保持整洁不与报错信息混在一起。12.8.3. 修改代码将错误信息打印到标准错误里的代码修改还算简单我们只需要把所有的报错信息从用println!打印改为用eprintln!打印即可。因为所有的报错处理都在main.rs里所以我们只需要对main.rs稍作修改即可lib.rs就完全不需要修改use std::env; use std::process; use minigrep::Config; fn main() { let args: VecString env::args().collect(); let config Config::new(args).unwrap_or_else(|err| { eprintln!(Problem parsing arguments: {}, err); process::exit(1); }); if let Err(e) minigrep::run(config) { eprintln!(Application error: {}, e); process::exit(1); } }然后我们再执行之前那个命令。那个指令没有带参数所以程序会报错但这次它不会把报错信息放在output.txt里而是会直接在终端中打印出来$ cargo run output.txt Problem parsing arguments: not enough arguments然后再试一下正常带参数的$ cargo run -- to poem.txt output.txt输出内容被重定向到output.txt里了打开它Are you nobody, too? How dreary to be somebody!这就是我们想要的结果错误直接在终端打印而正常输出在重定向的文件里。

相关新闻

CNN-LSTM-Attention混合模型在电力负荷预测中的实践

CNN-LSTM-Attention混合模型在电力负荷预测中的实践

1. 项目概述:CNN-LSTM-Attention混合架构的工程实践在电力负荷预测这类典型的时间序列预测场景中,传统统计方法(如ARIMA)往往难以捕捉非线性特征和长期依赖关系。三年前我在参与某省级电网的负荷预测系统升级时,首次尝…

2026/7/23 18:57:03阅读更多 →
基于MATLAB图像处理与神经网络的肺癌智能分类系统

基于MATLAB图像处理与神经网络的肺癌智能分类系统

摘要:开发一种基于图像处理技术和人工神经网络的肺癌智能分类系统,实现肺部医学影像中肿瘤的自动识别与良恶性判别,为临床诊断提供辅助参考。项目概览项目简介本研究采用MATLAB平台开发了一套完整的肺癌分类系统。首先,对肺部CT图…

2026/7/23 18:57:03阅读更多 →
【Rust自学】13.1. 闭包 Pt.1:什么是闭包、如何使用闭包

【Rust自学】13.1. 闭包 Pt.1:什么是闭包、如何使用闭包

13.1 闭包 Pt.1:什么是闭包、如何使用闭包 13.1.0. 写在正文之前 Rust语言在设计过程中受到了很多语言的启发,而函数式编程对Rust产生了非常显著的影响。函数式编程通常包括通过将函数作为值传递给参数、从其他函数返回它们、将它们分配给变量以供以后…

2026/7/23 18:57:03阅读更多 →
2026吴忠黄金回收白银回收铂金回收中检持证鉴定师铂金银饰高价回收门店联系方式推荐

2026吴忠黄金回收白银回收铂金回收中检持证鉴定师铂金银饰高价回收门店联系方式推荐

2026吴忠黄金白银铂金回收实测榜单|公安备案中检认证无折旧费门店推荐 吴忠黄金回收哪家靠谱|工商公安双备案中检认证实体门店 依托吴忠市落笔,本地贵金属回收店铺遍地丛生,行业套路层出不穷,不少市民变现遭遇虚高报价…

2026/7/23 21:39:33阅读更多 →
Python 实战:构建动态仪表盘快照与 Diff 平台,实现周期采集、结构变化检测与异常波动留证

Python 实战:构建动态仪表盘快照与 Diff 平台,实现周期采集、结构变化检测与异常波动留证

㊗️本期内容已收录至专栏《Python爬虫实战》,持续完善知识体系与项目实战,建议先订阅收藏,后续查阅更方便~ ㊙️本期爬虫难度指数:⭐⭐⭐⭐⭐(专家级) 🉐福利: 一次订阅后,专栏内的所有文章可永久免费看,持续更新中,保底1000+(篇)硬核实战内容。 全文目录: 🌟…

2026/7/23 21:39:33阅读更多 →
AI Agent如何重塑程序员工作流与核心竞争力

AI Agent如何重塑程序员工作流与核心竞争力

1. AI Agent如何重塑程序员的工作场景最近半年,我团队里三位资深开发者的日常工作发生了微妙变化:原本需要手动编写的单元测试现在由AI自动生成,代码审查时间从平均4小时缩短到40分钟,甚至连技术方案设计都开始出现AI参与的痕迹。…

2026/7/23 21:39:33阅读更多 →
中小企业靠什么盘活数据资产平台?数据资产平台如何落地轻量化数据要素运营?

中小企业靠什么盘活数据资产平台?数据资产平台如何落地轻量化数据要素运营?

很多中小企业管理者会混淆系统工具与数据资产平台,简单把BI报表软件、数据库存储系统等同于数据资产平台,这类认知偏差会直接导致数字化投入完全无法转化为数据资产收益,数据资产平台核心价值是完成数据要素确权、资产价值盘点、跨部门数据流…

2026/7/23 21:39:33阅读更多 →
给 AI 装上“资深工程师大脑“:Superpowers 方法论全解

给 AI 装上“资深工程师大脑“:Superpowers 方法论全解

版本:6.1.1 | 许可证:MIT | 作者:Jesse Vincent 与 Prime Radiant 团队 官方仓库:GitHub - obra/superpowers: An agentic skills framework & software development methodology that works. GitHub …

2026/7/23 21:39:33阅读更多 →
如何提供有效输入以生成高质量博文

如何提供有效输入以生成高质量博文

1. 关于无效输入的说明我注意到您提供的输入内容存在以下问题:项目标题为无意义的数字串"111111111111111111"项目正文完全空白关键词和摘要描述均为空值相关热搜词和网络热词也未提供有效信息2. 无法生成有效内容的原因2.1 输入信息严重不足根据您提供的…

2026/7/23 21:37:33阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/23 0:56:31阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/23 0:56:31阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 0:56:31阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:00:28阅读更多 →
从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:28阅读更多 →
油泥处理设备哪里能买到

油泥处理设备哪里能买到

油泥处理设备哪里有?这是许多从事油田、炼化、清罐业务的从业者最关心的问题。根据河南三丰环保设备有限公司的行业经验,选购油泥处理设备的核心在于设备能否适配当地环保法规与原料特性,而非单纯看价格。该公司总经理王钦田先生指出&#xf…

2026/7/23 0:00:28阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/22 22:56:18阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/23 18:58:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/23 18:58:18阅读更多 →