Rust 오류 메시지를 표준 오류로 출력하기

Beginner

This tutorial is from open-source community. Access the source code

소개

표준 출력 대신 표준 오류에 오류 메시지 작성하기에 오신 것을 환영합니다. 이 랩은 Rust Book의 일부입니다. LabEx 에서 Rust 기술을 연습할 수 있습니다.

이 랩에서는 오류 메시지가 표준 출력 (stdout) 대신 표준 오류 (stderr) 에 기록되도록 코드를 수정해야 합니다.

표준 출력 대신 표준 오류에 오류 메시지 작성하기

현재, 우리는 println! 매크로를 사용하여 모든 출력을 터미널에 쓰고 있습니다. 대부분의 터미널에는 두 종류의 출력이 있습니다: 일반 정보를 위한 표준 출력 (stdout) 과 오류 메시지를 위한 표준 오류 (stderr) 입니다. 이러한 구분을 통해 사용자는 프로그램의 성공적인 출력을 파일로 리디렉션하면서도 오류 메시지를 화면에 인쇄하도록 선택할 수 있습니다.

println! 매크로는 표준 출력에만 인쇄할 수 있으므로, 표준 오류에 인쇄하려면 다른 것을 사용해야 합니다.

오류가 어디에 기록되는지 확인하기

먼저, minigrep이 출력하는 내용이 현재 표준 출력에 어떻게 기록되는지 살펴보겠습니다. 여기에는 대신 표준 오류에 쓰고 싶은 모든 오류 메시지도 포함됩니다. 표준 출력 스트림을 파일로 리디렉션하는 동시에 의도적으로 오류를 발생시켜 이를 수행할 것입니다. 표준 오류 스트림은 리디렉션하지 않으므로 표준 오류로 전송된 모든 내용은 계속 화면에 표시됩니다.

명령줄 프로그램은 오류 메시지를 표준 오류 스트림으로 보내도록 되어 있으므로, 표준 출력 스트림을 파일로 리디렉션하더라도 화면에서 오류 메시지를 계속 볼 수 있습니다. 현재 우리 프로그램은 제대로 작동하지 않습니다. 오류 메시지 출력이 대신 파일에 저장되는 것을 곧 보게 될 것입니다!

이 동작을 시연하기 위해, 표준 출력 스트림을 리디렉션하려는 파일 경로인 output.txt와 함께 >를 사용하여 프로그램을 실행합니다. 인수를 전달하지 않으면 오류가 발생해야 합니다.

cargo run > output.txt

> 구문은 셸에게 표준 출력의 내용을 화면 대신 output.txt에 쓰도록 지시합니다. 예상했던 오류 메시지가 화면에 인쇄되지 않았으므로, 파일에 저장되었음에 틀림없습니다. output.txt에는 다음과 같은 내용이 있습니다.

Problem parsing arguments: not enough arguments

네, 오류 메시지가 표준 출력에 인쇄되고 있습니다. 이와 같은 오류 메시지가 표준 오류에 인쇄되어 성공적인 실행의 데이터만 파일에 저장되는 것이 훨씬 더 유용합니다. 이를 변경할 것입니다.

오류를 표준 오류에 인쇄하기

Listing 12-24 의 코드를 사용하여 오류 메시지가 인쇄되는 방식을 변경합니다. 이 장의 앞부분에서 수행한 리팩토링으로 인해, 오류 메시지를 인쇄하는 모든 코드는 main 함수 하나에 있습니다. 표준 라이브러리는 표준 오류 스트림에 인쇄하는 eprintln! 매크로를 제공하므로, 오류를 인쇄하기 위해 println!을 호출했던 두 곳을 eprintln!을 사용하도록 변경해 보겠습니다.

파일 이름: src/main.rs

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);
    }
}

Listing 12-24: eprintln!을 사용하여 오류 메시지를 표준 출력 대신 표준 오류에 작성하기

이제 동일한 방식으로, 인수를 사용하지 않고 표준 출력을 >로 리디렉션하여 프로그램을 다시 실행해 보겠습니다.

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

이제 오류가 화면에 표시되고 output.txt에는 아무것도 포함되어 있지 않습니다. 이는 명령줄 프로그램에서 예상되는 동작입니다.

오류를 발생시키지 않지만 표준 출력을 파일로 리디렉션하는 인수를 사용하여 프로그램을 다시 실행해 보겠습니다.

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

터미널에는 아무런 출력도 표시되지 않으며, output.txt에는 결과가 포함됩니다.

파일 이름: output.txt

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

이는 이제 성공적인 출력에는 표준 출력을, 오류 출력에는 표준 오류를 적절하게 사용하고 있음을 보여줍니다.

요약

축하합니다! 표준 출력 대신 표준 오류에 오류 메시지 쓰기 랩을 완료했습니다. LabEx 에서 더 많은 랩을 연습하여 기술을 향상시킬 수 있습니다.