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 - Не повторяйся).
Смотрите также
Для дополнительной информации об обработке ошибок и регистрации сообщений:
- Rust By Example о stdio: https://doc.rust-lang.org/rust-by-example/std_misc/stdio.html
- Книга Rust об обработке ошибок: https://doc.rust-lang.org/book/ch09-00-error-handling.html
- Крейт
log
Rust для более комплексной настройки регистрации: https://crates.io/crates/log