Xato xabarlarini standart chiqish oqimi o'rniga xato oqimiga yozish

Ayni paytda biz println! funksiyasidan foydalangan holda terminalga barcha chiqishlarimizni yozib olamiz. Ko'pgina terminallarda ikkita chiqish turi mavjud: umumiy ma'lumot uchun standart chiqish oqimi ( stdout ) va xato xabarlari uchun standart xato oqimi (stderr). Ushbu farq foydalanuvchilarga dasturning muvaffaqiyatli chiqishini faylga yo'naltirishni tanlashga imkon beradi, ammo shu bilan birga xato xabarlarini ekranga chiqaradi.

println! funktsiyasi (makrosi) faqat standart chiqishda chop etish mumkin, shuning uchun biz standart xatolar oqimiga chop etish uchun boshqa misollarda ko'rib chiqaylik.

Xatolar yozilgan joyni tekshirish

Birinchidan, keling, minigrep-dan chop etilgan kontent hozirda standart chiqishga qanday yozilishini, shu jumladan biz standart xato oqimiga yozmoqchi bo'lgan har qanday xato xabarlarini ko'rib chiqaylik. Biz buni standart chiqish oqimini faylga yo'naltirish va ataylab xatoga yo'l qo'yish orqali qilamiz. Biz standart xatolar oqimiga yo'naltirmaganimiz uchun, standart xatolar oqimiga yuborilgan har qanday tarkib ekranda paydo bo'lishda davom etadi.

Buyruq qatorining (cmd) dasturlari xato xabarlarini standart xato oqimiga yuborishi kutilmoqda, shuning uchun biz standart chiqish oqimini faylga yo'naltirsak ham, ekrandagi xato xabarlarini ko'rishimiz mumkin. Bizning dasturimiz hozirda to'g'ri ishlamayapti: biz xato xabari chiqishini faylga saqlayotganini ko'ramiz.

Ushbu xatti-harakatni namoyish qilish uchun biz dasturni > va output.txt fayl nomi bilan ishga tushiramiz. Biz standart chiqish oqimini yo'naltirishni xohlaymiz. Biz hech qanday dalil (argument) keltirmaymiz, bu xatoga olib kelishi kerak:

$ cargo run > output.txt

> sintaksisi qobiqqa (shellga) output.txt-ga ekran o'rniga standart chiqish (standard output) tarkibini yozishni buyuradi. Biz ekranda ko'rishni kutgan xato xabarini ko'rmadik, shuning uchun u faylda bo'lishi kerak. Yuqorida keltirilgan output.txt-ning holati:

Problem parsing arguments: not enough arguments

Ha, bizning xato xabarimiz standart chiqishda (standard outputga) ko'rsatiladi. Bunday xato xabarlarini standart xatolar oqimiga kiritish ancha foydali, shuning uchun faqat muvaffaqiyatli ishga tushirish ma'lumotlari faylga kiradi. Biz buni keyinchalik o'zgartiramiz.

Xatolarni standard xato oqimiga chop etish (print qilish)

Xato xabarlarini chiqarish usulini o'zgartirish uchun biz 12-24-ro'yxatdagi koddan foydalanamiz. Ushbu bobda ilgari qilgan refaktoring tufayli xato xabarlarini chop etadigan barcha kodlar bitta main funktsiyada joylashgan. Rust standart kutubxonasi eprintln! makrosini taqdim etadi va bu makro standart xato oqimiga kiradi, shuning uchun println! bilan chaqirilgan joyda, keling uning o'rniga eprintln! makrosini ishlatamiz.

Fayl: src/main.rs

use std::env;
use std::process;

use minigrep::Config;

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

    let config = Config::build(&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);
    }
}

Ro'yxat 12-24: println! yordamida Standard Output o'rniga Standard Error - da xato xabarlarini yozish!

Keling, dasturni xuddi shu tarzda, hech qanday dalilsiz (argumentsiz) qayta ishga tushiramiz va standart chiqishni (outputni) > bilan qayta yo'naltiramiz:

$ cargo run > output.txt
Problem parsing arguments: not enough arguments

Endi biz ekranda xatoni ko'rishimiz mumkin va output.txt esa bo'sh. Bu esa aynan buyruq qatoridan (cmd-dan) biz kutgan holat.

Keling, dasturni xatoga olib kelmaydigan argumentlar bilan qayta ishga tushiramiz, ammo baribir standart chiqish faylga yo'naltiradi, misol:

$ cargo run -- to poem.txt > output.txt

Biz terminalga hech qanday chiqishni ko'rmaymiz. Va output.txt esa quydagi natijalarni o'z ichiga oladi:

Fayl: output.txt

Are you nobody, too?
How dreary to be somebody!

Yani, biz vaziyatga qarab, muvaffaqiyatli chiqish (output) uchun standart chiqish oqimidan va xatolarni chiqarish uchun standart xato oqimidan foydalanamiz.

Xulosa

Ushbu bobda siz hozirgacha o'rgangan ba'zi asosiy tushunchalar takrorlangan va Rustda muntazam I/O operatsiyalarini qanday bajarish kerakligi aytilgan. Buyruq qatori argumentlari (command line argumentlari), fayllar, atrof-muhit o'zgaruvchilari va println! makrosi yordamida xatolarni ishlatgan holda, endi siz buyruq qatori (CLI) dasturlarini yozishga tayyormiz. Oldingi boblardagi tushunchalar bilan birgalikda sizning kodingiz yaxshi tartibga solinadi, ma'lumotlarni tegishli tuzilmalarda samarali saqlaydi, xatolarni yaxshi qayta ishlaydi va yaxshi sinovdan o'tkaziladi.

Keyinchalik, biz funktsional tillar ta'sirida bo'lgan Rust-ning ba'zi xususiyatlarini ko'rib chiqamiz: yopilishlar (closures) va iteratorlar.