Mensajes de error de Rust al error estándar

RustRustBeginner
Practicar Ahora

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

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

Bienvenido a Escribir mensajes de error en el error estándar en lugar de la salida estándar. Esta práctica es parte del Rust Book. Puedes practicar tus habilidades de Rust en LabEx.

En esta práctica, debemos modificar nuestro código para que los mensajes de error se escriban en el error estándar (stderr) en lugar de la salida estándar (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{{"Mensajes de error de Rust al error estándar"}} rust/function_syntax -.-> lab-100423{{"Mensajes de error de Rust al error estándar"}} rust/expressions_statements -.-> lab-100423{{"Mensajes de error de Rust al error estándar"}} rust/method_syntax -.-> lab-100423{{"Mensajes de error de Rust al error estándar"}} rust/operator_overloading -.-> lab-100423{{"Mensajes de error de Rust al error estándar"}} end

Escribir mensajes de error en el error estándar en lugar de la salida estándar

En este momento, estamos escribiendo toda nuestra salida en la terminal utilizando la macro println!. En la mayoría de las terminales, hay dos tipos de salida: salida estándar (stdout) para información general y error estándar (stderr) para mensajes de error. Esta distinción permite a los usuarios elegir dirigir la salida exitosa de un programa a un archivo, pero aún así imprimir los mensajes de error en la pantalla.

La macro println! solo es capaz de imprimir en la salida estándar, por lo que tenemos que utilizar algo más para imprimir en el error estándar.

Comprobar dónde se escriben los errores

Primero, observemos cómo el contenido impreso por minigrep se está escribiendo actualmente en la salida estándar, incluyendo cualquier mensaje de error que queramos escribir en el error estándar en lugar de eso. Lo haremos redirigiendo el flujo de salida estándar a un archivo mientras causamos intencionalmente un error. No redirigiremos el flujo de error estándar, por lo que cualquier contenido enviado al error estándar seguirá mostrándose en la pantalla.

Se espera que los programas de línea de comandos envíen mensajes de error al flujo de error estándar para que aún podamos ver los mensajes de error en la pantalla incluso si redirigimos el flujo de salida estándar a un archivo. Nuestro programa no se comporta bien en este momento: ¡vamos a ver que guarda la salida del mensaje de error en un archivo en lugar de mostrarlo en la pantalla!

Para demostrar este comportamiento, ejecutaremos el programa con > y la ruta del archivo, output.txt, al que queremos redirigir el flujo de salida estándar. No pasaremos ningún argumento, lo que debería causar un error:

cargo run > output.txt

La sintaxis > le dice a la shell que escriba el contenido de la salida estándar en output.txt en lugar de en la pantalla. No vimos el mensaje de error que esperábamos impreso en la pantalla, por lo que eso significa que debe haber terminado en el archivo. Esto es lo que contiene output.txt:

Problem parsing arguments: not enough arguments

Sí, nuestro mensaje de error se está imprimiendo en la salida estándar. Es mucho más útil que los mensajes de error como este se impriman en el error estándar para que solo los datos de una ejecución exitosa terminen en el archivo. Vamos a cambiar eso.

Imprimir errores en el error estándar

Usaremos el código de la Lista 12-24 para cambiar cómo se imprimen los mensajes de error. Debido a la refactorización que hicimos al principio de este capítulo, todo el código que imprime mensajes de error está en una función, main. La biblioteca estándar proporciona la macro eprintln! que imprime en el flujo de error estándar, así que cambiemos los dos lugares donde estábamos llamando a println! para imprimir errores y usemos eprintln! en su lugar.

Nombre del archivo: 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);
    }
}

Lista 12-24: Escribir mensajes de error en el error estándar en lugar de la salida estándar usando eprintln!

Ahora ejecutemos el programa de nuevo de la misma manera, sin ningún argumento y redirigiendo la salida estándar con >:

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

Ahora vemos el error en pantalla y output.txt no contiene nada, que es el comportamiento que esperamos de los programas de línea de comandos.

Ejecutemos el programa de nuevo con argumentos que no causen un error pero sigan redirigiendo la salida estándar a un archivo, así:

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

No veremos ninguna salida en la terminal, y output.txt contendrá nuestros resultados:

Nombre del archivo: output.txt

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

Esto demuestra que ahora estamos usando la salida estándar para la salida exitosa y el error estándar para la salida de error, según corresponda.

Resumen

¡Felicidades! Has completado la práctica de Escribir mensajes de error en el error estándar en lugar de la salida estándar. Puedes practicar más prácticas en LabEx para mejorar tus habilidades.