Messages d'erreur Rust sur la sortie d'erreur standard

RustRustBeginner
Pratiquer maintenant

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

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Bienvenue dans Écrire des messages d'erreur sur la sortie d'erreur standard au lieu de la sortie standard. Ce laboratoire est une partie du Rust Book. Vous pouvez pratiquer vos compétences Rust dans LabEx.

Dans ce laboratoire, nous devons modifier notre code pour que les messages d'erreur soient écrits sur la sortie d'erreur standard (stderr) au lieu de la sortie standard (stdout).


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL rust(("Rust")) -.-> rust/BasicConceptsGroup(["Basic Concepts"]) rust(("Rust")) -.-> rust/FunctionsandClosuresGroup(["Functions and Closures"]) rust(("Rust")) -.-> rust/DataStructuresandEnumsGroup(["Data Structures and Enums"]) rust(("Rust")) -.-> rust/AdvancedTopicsGroup(["Advanced Topics"]) rust/BasicConceptsGroup -.-> rust/variable_declarations("Variable Declarations") rust/FunctionsandClosuresGroup -.-> rust/function_syntax("Function Syntax") rust/FunctionsandClosuresGroup -.-> rust/expressions_statements("Expressions and Statements") rust/DataStructuresandEnumsGroup -.-> rust/method_syntax("Method Syntax") rust/AdvancedTopicsGroup -.-> rust/operator_overloading("Traits for Operator Overloading") subgraph Lab Skills rust/variable_declarations -.-> lab-100423{{"Messages d'erreur Rust sur la sortie d'erreur standard"}} rust/function_syntax -.-> lab-100423{{"Messages d'erreur Rust sur la sortie d'erreur standard"}} rust/expressions_statements -.-> lab-100423{{"Messages d'erreur Rust sur la sortie d'erreur standard"}} rust/method_syntax -.-> lab-100423{{"Messages d'erreur Rust sur la sortie d'erreur standard"}} rust/operator_overloading -.-> lab-100423{{"Messages d'erreur Rust sur la sortie d'erreur standard"}} end

Écrire des messages d'erreur sur la sortie d'erreur standard au lieu de la sortie standard

À l'heure actuelle, nous écrivons toute notre sortie dans le terminal en utilisant la macro println!. Dans la plupart des terminaux, il existe deux types de sortie : la sortie standard (stdout) pour les informations générales et la sortie d'erreur standard (stderr) pour les messages d'erreur. Cette distinction permet aux utilisateurs de choisir de rediriger la sortie réussie d'un programme vers un fichier tout en imprimant toujours les messages d'erreur sur l'écran.

La macro println! est seulement capable d'imprimer sur la sortie standard, donc nous devons utiliser autre chose pour imprimer sur la sortie d'erreur standard.

Vérifier où les erreurs sont écrites

Commençons par observer comment le contenu imprimé par minigrep est actuellement écrit sur la sortie standard, y compris tous les messages d'erreur que nous souhaitons écrire sur la sortie d'erreur standard à la place. Nous allons le faire en redirigeant le flux de sortie standard vers un fichier tout en provoquant intentionnellement une erreur. Nous ne redirigerons pas le flux de sortie d'erreur, de sorte que tout contenu envoyé à la sortie d'erreur continuera à s'afficher sur l'écran.

On s'attend à ce que les programmes de ligne de commande envoient les messages d'erreur au flux de sortie d'erreur standard, de sorte que nous pouvons toujours voir les messages d'erreur sur l'écran même si nous redirigeons le flux de sortie standard vers un fichier. Notre programme n'est pas actuellement bien comporté : nous allons voir qu'il enregistre la sortie de message d'erreur dans un fichier au lieu de l'afficher sur l'écran!

Pour démontrer ce comportement, nous allons exécuter le programme avec > et le chemin du fichier, output.txt, vers lequel nous souhaitons rediriger le flux de sortie standard. Nous ne passerons aucun argument, ce qui devrait provoquer une erreur :

cargo run > output.txt

La syntaxe > indique au shell d'écrire le contenu de la sortie standard dans output.txt au lieu de l'afficher sur l'écran. Nous n'avons pas vu le message d'erreur que nous attendions s'afficher sur l'écran, ce qui signifie qu'il doit être fini dans le fichier. Voici ce que contient output.txt :

Problem parsing arguments: not enough arguments

Effectivement, notre message d'erreur est imprimé sur la sortie standard. Il est beaucoup plus utile que les messages d'erreur comme celui-ci soient imprimés sur la sortie d'erreur, de sorte que seul les données provenant d'une exécution réussie se retrouvent dans le fichier. Nous allons corriger cela.

Imprimer les erreurs sur la sortie d'erreur standard

Nous allons utiliser le code de la Liste 12-24 pour changer la façon dont les messages d'erreur sont imprimés. En raison du refactoring que nous avons effectué plus tôt dans ce chapitre, tout le code qui imprime les messages d'erreur est dans une seule fonction, main. La bibliothèque standard fournit la macro eprintln! qui imprime sur le flux de sortie d'erreur standard, donc modifions les deux endroits où nous appelions println! pour imprimer des erreurs pour utiliser eprintln! à la place.

Nom de fichier : 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);
    }
}

Liste 12-24 : Écrire des messages d'erreur sur la sortie d'erreur standard au lieu de la sortie standard en utilisant eprintln!

Exécutons maintenant le programme à nouveau de la même manière, sans aucun argument et en redirigeant la sortie standard avec > :

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

Maintenant, nous voyons l'erreur à l'écran et output.txt est vide, ce qui est le comportement que nous attendons des programmes de ligne de commande.

Exécutons le programme à nouveau avec des arguments qui ne provoquent pas d'erreur mais qui redirigent toujours la sortie standard vers un fichier, comme ceci :

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

Nous n'allons pas voir de sortie sur le terminal, et output.txt contiendra nos résultats :

Nom de fichier : output.txt

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

Cela démontre que nous utilisons maintenant la sortie standard pour la sortie réussie et la sortie d'erreur standard pour la sortie d'erreur, comme il se doit.

Sommaire

Félicitations! Vous avez terminé le laboratoire Écrire des messages d'erreur sur la sortie d'erreur standard au lieu de la sortie standard. Vous pouvez pratiquer d'autres laboratoires dans LabEx pour améliorer vos compétences.