Mensagens de Erro Rust para Saída de Erro Padrão

Beginner

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

Introdução

Bem-vindo a Escrevendo Mensagens de Erro para Saída de Erro Padrão em Vez de Saída Padrão. Este laboratório faz parte do Livro Rust. Você pode praticar suas habilidades em Rust no LabEx.

Neste laboratório, precisamos modificar nosso código para que as mensagens de erro sejam escritas na saída de erro padrão (stderr) em vez da saída padrão (stdout).

Escrevendo Mensagens de Erro para Saída de Erro Padrão em Vez de Saída Padrão

No momento, estamos escrevendo toda a nossa saída para o terminal usando a macro println!. Na maioria dos terminais, existem dois tipos de saída: saída padrão (stdout) para informações gerais e saída de erro padrão (stderr) para mensagens de erro. Essa distinção permite que os usuários escolham direcionar a saída bem-sucedida de um programa para um arquivo, mas ainda imprimir mensagens de erro na tela.

A macro println! é capaz apenas de imprimir na saída padrão, então temos que usar outra coisa para imprimir na saída de erro padrão.

Verificando Onde os Erros São Escritos

Primeiro, vamos observar como o conteúdo impresso por minigrep está sendo escrito atualmente na saída padrão, incluindo quaisquer mensagens de erro que queremos escrever na saída de erro padrão. Faremos isso redirecionando o fluxo de saída padrão para um arquivo, enquanto intencionalmente causamos um erro. Não redirecionaremos o fluxo de erro padrão, então qualquer conteúdo enviado para a saída de erro padrão continuará a ser exibido na tela.

Espera-se que os programas de linha de comando enviem mensagens de erro para o fluxo de erro padrão, para que ainda possamos ver as mensagens de erro na tela, mesmo que redirecionemos o fluxo de saída padrão para um arquivo. Nosso programa não está se comportando bem no momento: estamos prestes a ver que ele salva a saída da mensagem de erro em um arquivo!

Para demonstrar esse comportamento, executaremos o programa com > e o caminho do arquivo, output.txt, para o qual queremos redirecionar o fluxo de saída padrão. Não passaremos nenhum argumento, o que deve causar um erro:

cargo run > output.txt

A sintaxe > diz ao shell para escrever o conteúdo da saída padrão em output.txt em vez da tela. Não vimos a mensagem de erro que esperávamos impressa na tela, então isso significa que ela deve ter acabado no arquivo. É isso que output.txt contém:

Problem parsing arguments: not enough arguments

Sim, nossa mensagem de erro está sendo impressa na saída padrão. É muito mais útil que mensagens de erro como essa sejam impressas na saída de erro padrão, para que apenas dados de uma execução bem-sucedida acabem no arquivo. Vamos mudar isso.

Imprimindo Erros na Saída de Erro Padrão

Usaremos o código na Listagem 12-24 para alterar como as mensagens de erro são impressas. Devido à refatoração que fizemos anteriormente neste capítulo, todo o código que imprime mensagens de erro está em uma função, main. A biblioteca padrão fornece a macro eprintln! que imprime no fluxo de erro padrão, então vamos alterar os dois lugares onde estávamos chamando println! para imprimir erros para usar eprintln! em vez disso.

Nome do arquivo: 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);
    }
}

Listagem 12-24: Escrevendo mensagens de erro na saída de erro padrão em vez da saída padrão usando eprintln!

Agora, vamos executar o programa novamente da mesma forma, sem nenhum argumento e redirecionando a saída padrão com >:

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

Agora vemos o erro na tela e output.txt não contém nada, que é o comportamento que esperamos dos programas de linha de comando.

Vamos executar o programa novamente com argumentos que não causam um erro, mas ainda redirecionam a saída padrão para um arquivo, assim:

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

Não veremos nenhuma saída no terminal, e output.txt conterá nossos resultados:

Nome do arquivo: output.txt

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

Isso demonstra que agora estamos usando a saída padrão para saída bem-sucedida e a saída de erro padrão para saída de erro, conforme apropriado.

Resumo

Parabéns! Você concluiu o laboratório Escrevendo Mensagens de Erro na Saída de Erro Padrão em Vez da Saída Padrão. Você pode praticar mais laboratórios no LabEx para aprimorar suas habilidades.