Запись в стандартный поток ошибок

Rust:
Запись в стандартный поток ошибок

Как это делается:

Rust делает запись в stderr простой. Используйте макрос eprintln! для текста, так же, как println!, но для ошибок.

fn main() {
    // Обычный вывод
    println!("Это обычное сообщение.");

    // Вывод ошибки
    eprintln!("Это сообщение об ошибке.");
}

Пример вывода:

Это обычное сообщение.
Это сообщение об ошибке.

Заметьте, сообщение об ошибке идет в stderr. В терминале вы не увидите разницы. Однако, если вы перенаправите stdout, stderr все равно появится в консоли.

$ cargo run > output.txt
Это сообщение об ошибке.

Здесь output.txt будет содержать только “Это обычное сообщение.”

Подробнее

Исторически разделение stdout и stderr позволяло Unix системам обрабатывать обычные и ошибочные данные по-разному. Это хорошая практика и помогает в автоматизации и регистрации сообщений.

Альтернативы записи в stderr более низкого уровня, например, использование std::io::stderr. Это дает больше контроля и хорошо работает для данных, не являющихся текстом.

use std::io::{self, Write};

fn main() -> io::Result<()> {
    let stderr = &mut io::stderr();
    
    // Напрямую записать строку в stderr
    writeln!(stderr, "Ошибка: Невозможно завершить операцию")?;
    
    Ok(())
}

Под капотом, eprintln! - это макрос, обертывающий writeln! в stderr, что позволяет соблюдать принцип DRY (Don’t Repeat Yourself - Не повторяйся).

Смотрите также

Для дополнительной информации об обработке ошибок и регистрации сообщений: