W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
ch12-06-writing-to-stderr-instead-of-stdout.md
commit c5c12e911b20fac20eefc511f6fe8d432a8e5ec2
目前為止,我們將所有的輸出都通過 println!
寫到了終端。大部分終端都提供了兩種輸出:標(biāo)準(zhǔn)輸出(standard output,stdout
)對(duì)應(yīng)一般信息,標(biāo)準(zhǔn)錯(cuò)誤(standard error,stderr
)則用于錯(cuò)誤信息。這種區(qū)別允許用戶選擇將程序正常輸出定向到一個(gè)文件中并仍將錯(cuò)誤信息打印到屏幕上。
但是 println!
宏只能夠打印到標(biāo)準(zhǔn)輸出,所以我們必須使用其他方法來(lái)打印到標(biāo)準(zhǔn)錯(cuò)誤。
首先,讓我們觀察一下目前 minigrep
打印的所有內(nèi)容是如何被寫入標(biāo)準(zhǔn)輸出的,包括那些應(yīng)該被寫入標(biāo)準(zhǔn)錯(cuò)誤的錯(cuò)誤信息??梢酝ㄟ^將標(biāo)準(zhǔn)輸出流重定向到一個(gè)文件同時(shí)有意產(chǎn)生一個(gè)錯(cuò)誤來(lái)做到這一點(diǎn)。我們沒有重定向標(biāo)準(zhǔn)錯(cuò)誤流,所以任何發(fā)送到標(biāo)準(zhǔn)錯(cuò)誤的內(nèi)容將會(huì)繼續(xù)顯示在屏幕上。
命令行程序被期望將錯(cuò)誤信息發(fā)送到標(biāo)準(zhǔn)錯(cuò)誤流,這樣即便選擇將標(biāo)準(zhǔn)輸出流重定向到文件中時(shí)仍然能看到錯(cuò)誤信息。目前我們的程序并不符合期望;相反我們將看到它將錯(cuò)誤信息輸出保存到了文件中。
我們通過 >
和文件名 output.txt 來(lái)運(yùn)行程序,我們期望重定向標(biāo)準(zhǔn)輸出流到該文件中。在這里,我們沒有傳遞任何參數(shù),所以會(huì)產(chǎn)生一個(gè)錯(cuò)誤:
$ cargo run > output.txt
>
語(yǔ)法告訴 shell 將標(biāo)準(zhǔn)輸出的內(nèi)容寫入到 output.txt 文件中而不是屏幕上。我們并沒有看到期望的錯(cuò)誤信息打印到屏幕上,所以這意味著它一定被寫入了文件中。如下是 output.txt 所包含的:
Problem parsing arguments: not enough arguments
是的,錯(cuò)誤信息被打印到了標(biāo)準(zhǔn)輸出中。像這樣的錯(cuò)誤信息被打印到標(biāo)準(zhǔn)錯(cuò)誤中將會(huì)有用得多,將使得只有成功運(yùn)行所產(chǎn)生的輸出才會(huì)寫入文件。我們接下來(lái)就修改。
讓我們?nèi)缡纠?12-24 所示的代碼改變錯(cuò)誤信息是如何被打印的。得益于本章早些時(shí)候的重構(gòu),所有打印錯(cuò)誤信息的代碼都位于 main
一個(gè)函數(shù)中。標(biāo)準(zhǔn)庫(kù)提供了 eprintln!
宏來(lái)打印到標(biāo)準(zhǔn)錯(cuò)誤流,所以將兩個(gè)調(diào)用 println!
打印錯(cuò)誤信息的位置替換為 eprintln!
:
文件名: src/main.rs
fn main() {
let args: Vec<String> = 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);
}
}
示例 12-24:使用 eprintln!
將錯(cuò)誤信息寫入標(biāo)準(zhǔn)錯(cuò)誤而不是標(biāo)準(zhǔn)輸出
將 println!
改為 eprintln!
之后,讓我們?cè)俅螄L試用同樣的方式運(yùn)行程序,不使用任何參數(shù)并通過 >
重定向標(biāo)準(zhǔn)輸出:
$ cargo run > output.txt
Problem parsing arguments: not enough arguments
現(xiàn)在我們看到了屏幕上的錯(cuò)誤信息,同時(shí) output.txt 里什么也沒有,這正是命令行程序所期望的行為。
如果使用不會(huì)造成錯(cuò)誤的參數(shù)再次運(yùn)行程序,不過仍然將標(biāo)準(zhǔn)輸出重定向到一個(gè)文件,像這樣:
$ cargo run to poem.txt > output.txt
我們并不會(huì)在終端看到任何輸出,同時(shí) output.txt
將會(huì)包含其結(jié)果:
文件名: output.txt
Are you nobody, too?
How dreary to be somebody!
這一部分展示了現(xiàn)在我們適當(dāng)?shù)氖褂昧顺晒r(shí)產(chǎn)生的標(biāo)準(zhǔn)輸出和錯(cuò)誤時(shí)產(chǎn)生的標(biāo)準(zhǔn)錯(cuò)誤。
在這一章中,我們回顧了目前為止的一些主要章節(jié)并涉及了如何在 Rust 環(huán)境中進(jìn)行常規(guī)的 I/O 操作。通過使用命令行參數(shù)、文件、環(huán)境變量和打印錯(cuò)誤的 eprintln!
宏,現(xiàn)在你已經(jīng)準(zhǔn)備好編寫命令行程序了。通過結(jié)合前幾章的知識(shí),你的代碼將會(huì)是組織良好的,并能有效的將數(shù)據(jù)存儲(chǔ)到合適的數(shù)據(jù)結(jié)構(gòu)中、更好的處理錯(cuò)誤,并且還是經(jīng)過良好測(cè)試的。
接下來(lái),讓我們探索一些 Rust 中受函數(shù)式編程語(yǔ)言影響的功能:閉包和迭代器。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: