如何将输出发送到stderr

tsh*_*ang 40 stdio rust

一个使用它将输出发送到stdout:

println!("some output")
Run Code Online (Sandbox Code Playgroud)

我认为没有相应的宏可以为stderr做同样的事情.

She*_*ter 71

在Rust 1.19之后

从Rust 1.19开始,您可以使用eprinteprintln宏:

fn main() {
    eprintln!("This is going to standard error!, {}", "awesome");
}
Run Code Online (Sandbox Code Playgroud)

这最初是在RFC 1896中提出的.

在Rust 1.19之前

你可以看到它的实现,println!以深入了解它是如何工作的,但是当我第一次阅读它时,它有点压倒性.

您可以使用类似的宏格式化东西到stderr:

use std::io::Write;

let name = "world";
writeln!(&mut std::io::stderr(), "Hello {}!", name);
Run Code Online (Sandbox Code Playgroud)

这会给你一个unused result which must be used警告,因为打印到IO 可能会失败(这不是我们打印时通常会考虑的事情!).我们可以看到现有方法在这种情况下只是恐慌,所以我们可以更新我们的代码来做同样的事情:

use std::io::Write;

let name = "world";
let r = writeln!(&mut std::io::stderr(), "Hello {}!", name);
r.expect("failed printing to stderr");
Run Code Online (Sandbox Code Playgroud)

这有点多了,所以让我们把它换回宏:

use std::io::Write;

macro_rules! println_stderr(
    ($($arg:tt)*) => { {
        let r = writeln!(&mut ::std::io::stderr(), $($arg)*);
        r.expect("failed printing to stderr");
    } }
);

fn main() {
    let name = "world";
    println_stderr!("Hello {}!", name)
}
Run Code Online (Sandbox Code Playgroud)

  • 您还可以执行 `writeln!(...).unwrap();` 以最简单的方式处理可能的失败。 (2认同)

Fra*_*gné 19

print!并且println!是写入标准输出的便捷方法.还有其他宏具有相同的格式化功能可用于不同的任务:

要写入标准错误流,您可以使用writeln!如下所示:

use std::io::Write;

fn main() {
    let mut stderr = std::io::stderr();
    writeln!(&mut stderr, "Error!").unwrap();
}
Run Code Online (Sandbox Code Playgroud)