14.6.将错误重定向到标准错误

之前,我们把所欲的的输出都使用println!宏显示终端屏幕上。在大部分终端上,都有两种输出,一种是标准输出显示通用信息,另一种是标准错误用于显示错误信息。这个区别可以使用户能将成功的信息保存到一个文件,而错误的信息显示在屏幕上。

println!宏只能向标准输出设备上显示信息,因此我们还需要别的命令可以向标准错误输出信息。

14.6.1 检查错误的位置

首先,观察一下程序要显示的信息是如何被写入标准输出的,也包括那些我们想要替换到标准错误的错误消息。我们故意产生一个错误,把标准输出的内容重定向到一个文件。同时我们不会重定向标准错误,因此错误信息会继续显示在屏幕上。

即使将标准输出流被定向到文件中,命令行程序依旧期待将错误信息发送到标准错误流中,以便我们仍然可以在屏幕上看到错误信息。但是之前完成的编码会把所有的信息都保存到文件中。

为了掩饰这种效果,我们运行命令使用重定向符号">"和一个文件名(output.txt),这个文件就是我们想要把标准错误重定向的目的地。运行命令我们不带该带的参数,程序会报错:

rust 复制代码
$ cargo run > output.txt

符号">"告诉shell将标准输出的内容保存文件output.txt中,而不是显示到屏幕上。我们不会在屏幕上看到错误信息的输出,必须打开文件才能看到文件中的内容:

rust 复制代码
解析参数出错:文件参数不足!

为了避免错误信息只保留在文件中而不显示在屏幕上的问题,我们必须将错误信息输出到标准错误,而不是标准输出,这样只有成功的信息才会被保存到文件中。

14.6.2 显示错误到标准错误输出

查看之前的代码,修改需要显式的错误信息的内容,由于所有需要显示错误信息的代码都在main函数中,改动量不大。标准库提供了eprintln!宏来输出标准错误流,让我们把两处使用println!显示错误信息的代码修改为eprintln!宏:

rust 复制代码
fn main() {

    let args: Vec<String> = env::args().collect();

    let config = Config::build(&args).unwrap_or_else(|err| {

        eprintln!("解析参数出错:{err}");

        process::exit(1);

    });

    println!("要搜索的字符串是:{}",config.query);

    println!("要搜素的文件是:{}",config.file_path);

    if let Err(e) =run(config){

        eprintln!("错误信息是:{e}");

        process::exit(1);

    };

}

再次运行上次的命令,没有带任何参数,带有重定向符和文件名:

rust 复制代码
cargo run > output.txt                                                                          

   Compiling lession14_005 v0.1.0 (D:\projects\rust\rust_learn\lession14_005)

    Finished `dev` profile [unoptimized + debuginfo] target(s) in 1.02s                                                                      

     Running `target\debug\lession14_005.exe`

解析参数出错:文件参数不足!

error: process didn't exit successfully: `target\debug\lession14_005.exe` (exit code: 1)

可以看到错误信息,同时output.txt文件中没有任何信息。正如我们预期的那样。

再次运行命令,带上完整的参数并重定向到output文件中,看看最终的结果。

output.txt文件中的内容为:

rust 复制代码
Are you nobody, too?

How dreary to be somebody!

上面的内容演示了程序运行成功时,成功的消息内容使用标准输出保存到文件中,程序运行失败后,错误消息使用标准错误输出到屏幕上。

14.6.3 总结

本章重温了之前学习过的一些主要概念并涵盖了如何在Rust中执行标准输入/输出的操作。通过使用命令行参数,文件、环境变量、标准错误宏显示错误,你已经知道了如何写一个命令行程序。综合了前面学习过的内容,你的代码将变得更加有组织性,使用合适的数据结构高效的保存数据,友好的处理错误,有效的测试代码等等内容。

相关推荐
喵个咪5 小时前
Go Wind UBA 拆解系列 - 架构总览:三服务、数据流与契约优先
大数据·后端·go
喵个咪5 小时前
Go Wind UBA 拆解系列 - 多租户与安全:两套隔离机制的边界
大数据·后端·go
喵个咪5 小时前
Go Wind UBA 拆解系列 - OLAP 与 SQL 硬核:25 个分析模型怎么落地
大数据·后端·go
喵个咪5 小时前
Go Wind UBA 拆解系列 - SDK 与采集层:从浏览器到 Kafka
大数据·后端·go
掘金一周5 小时前
对车完全小白,不知买油买电还是买混动,求建议| 沸点周刊 7.2
前端·人工智能·后端
parade岁月6 小时前
MySQL JOIN解析:朴实无华但食之有味
数据库·后端
妙码生花6 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(十六):目录结构更新、完善 token 系统(AI 表示 token 入库无需加密?)
前端·后端·ai编程
程序me6 小时前
Prompt、Context、Harness、Loop 之后是什么? AI工程下一个半年的关键词
前端·后端·ai编程
米沙AI6 小时前
go语言项目--实例化(图书管理)--v1
后端
MeixianAgent6 小时前
Python 回测数据入口怎么验?历史 K 线入库前先做 5 个检查
后端·python