Refined Ch12.

This commit is contained in:
Peng Hailin, 2023-11-30 21:05:32 +08:00
parent 0a570430f3
commit 8def6bdb0e
2 changed files with 38 additions and 8 deletions

View File

@ -0,0 +1,3 @@
在文件 poem.txt 中检索to
Are you nobody, too?
How dreary to be somebody!

View File

@ -12,9 +12,36 @@
那个 `println!` 宏,只能打印到标准输出,因此这里就不得不使用其他物件,来打印到标准错误了。
## 对错误被写到何处进行检视
## 检视报错被写到何处
这里将使用清单 12-24 中的代码,来修改错误消息被打印出的方式。由于本章中早前完成的重构,现在打印错误消息的全部代码,就在一个函数,即 `main` 中了。Rust 标准库提供了打印到标准错误流the standard error stream`eprintln!` 宏,那么这里就来修改之前曾调用了 `println!` 的两个地方,以使用 `eprintln!` 来打印错误消息。
**Checking Where Errors Are Written**
首先,我们来观察一下 `minigrep` 打印的内容,目前是如何写入标准输出的,包括我们想转而写入标准错误的任何错误信息。为此,我们将在有意引入一处错误的同时,把标准输出流重定向到某个文件。我们不会重定向标准错误流,因此发送到标准错误的任何内容,仍都将继续显示在屏幕上。
命令行程序预期会将错误信息,发送到标准错误流,因此即使我们将标准输出流,重定向到某个文件,也能在屏幕上看到错误信息。我们的程序目前表现不佳:我们将看到,他会将错误信息输出保存到某个文件中!
为演示这种行为,我们将以 `>` 和我们打算将标准输出流重定向到的文件 `output.txt` 路径,运行这个程序。我们将不传递任何参数,因为这会导致一个错误:
```console
$ cargo run > output.txt
```
其中的 `>` 语法,告诉 shell 将标准输出的内容,写入 `output.txt` 而非屏幕。我们没有看到,咱们所预期的错误信息,被打印在屏幕上,这就意味着他必定已经进入了那个文件。下面就是 `output.txt` 文件所包含的内容:
```txt
解析参数时遇到问题:未曾获取到查询字串
```
没错,我们的错误信息,被打印到了标准输出。将这样的错误信息,打印到标准错误中,会更有用,这样只有成功运行的数据,才会出现在文件中。我们将改变这一点。
## 将错误信息打印到标准错误
**Printing Errors to Standard Error**
我们将使用清单 12-24 中的代码,来更改错误信息的打印方式。由于本章前面的重构,所有打印错误信息的代码,都在 `main` 一个函数中。标准库提供了 `eprintln!` 这个,可以打印到标准错误流中的宏,因此咱们来将调用 `println!` 打印错误信息的两个地方,改为使用 `eprintln!`
文件名:`src/main.rs`
@ -38,7 +65,7 @@ fn main() {
*清单 12-24使用 `eprintln!` 将错误消息写到标准错误而非标准输出*
现在来一同样方式再度运行这个程序,不带任何参数并使用 `>` 对标准输出进行重定向redirecting standard output with `>`
咱们现在来以不带任何参数,并使用 `>` 重定向标准输出的同样方式,再度运行这个程序
```console
$ cargo run > output.txt  ✔
@ -48,15 +75,15 @@ $ cargo run > output.txt  ✔
解析参数时遇到问题:参数数量不足
```
现在就看到了屏幕上的错误消息,同时发现 *output.txt* 中什么也没有,而这正是这所期望的命令行程序的行为了
现在,我们在屏幕上看到了错误,而 `output.txt` 不包含任何内容,这正是我们所期望的命令行程序的行为
下面来以一些不会引起错误的参数,再度运行这个程序,不过仍要把标准输出重定向到某个文件,像下面这样:
咱们来以一些不会导致错误,但仍会将标准输出重定向到文件的参数,再度运行这个程序,就像这样:
```console
$ cargo run -- to poem.txt > output.txt
```
这里将不会看见到终端的任何输出,而 *output.txt* 则会包含这里的结果:
我们不会看到,任何到终端的输出,而 `output.txt` 将包含我们的结果:
文件名:`output.txt`
@ -66,10 +93,10 @@ Are you nobody, too?
How dreary to be somebody!
```
就证明现在正分别对成功输出使用着标准输出,而对错误输出使用着标准错误
表明我们现在,恰如其分的将标准输出,用于了成功的输出,而将标准错误,用于了错误输出
## 本章小节
# 本章小节
本章回顾了到目前为止曾学过的一些主要概念,并涵盖了在 Rust 中怎样完成常见 I/O 操作。经由使用命令行参数、文件、环境变量,以及那个用于打印错误的 `eprintln!` 宏,现在就已准备好编写命令行应用程序了。结合先前那些章中的概念,咱们所编写的代码将是良好组织、以恰当数据结构有效地存储着数据、对错误加以优美地处理,并被妥善地测试过。