Gérer les erreurs avec Box en Rust

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

Dans ce laboratoire, le code montre comment utiliser le type Box pour conserver les erreurs originales en les enveloppant, permettant un traitement dynamique des erreurs, et le trait From de la bibliothèque Std aide à convertir tout type qui implémente le trait Error en l'objet trait Box<Error>. Il inclut un exemple de conversion et de traitement d'erreurs en utilisant Box avec un type d'erreur personnalisé.

Note : Si le laboratoire ne spécifie pas de nom de fichier, vous pouvez utiliser n'importe quel nom de fichier que vous voulez. Par exemple, vous pouvez utiliser main.rs, le compiler et l'exécuter avec rustc main.rs &&./main.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL rust(("Rust")) -.-> rust/AdvancedTopicsGroup(["Advanced Topics"]) rust(("Rust")) -.-> rust/BasicConceptsGroup(["Basic Concepts"]) rust(("Rust")) -.-> rust/DataTypesGroup(["Data Types"]) rust(("Rust")) -.-> rust/FunctionsandClosuresGroup(["Functions and Closures"]) rust(("Rust")) -.-> rust/DataStructuresandEnumsGroup(["Data Structures and Enums"]) rust/BasicConceptsGroup -.-> rust/variable_declarations("Variable Declarations") rust/DataTypesGroup -.-> rust/integer_types("Integer Types") rust/DataTypesGroup -.-> rust/string_type("String Type") 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/traits("Traits") rust/AdvancedTopicsGroup -.-> rust/operator_overloading("Traits for Operator Overloading") subgraph Lab Skills rust/variable_declarations -.-> lab-99248{{"Gérer les erreurs avec Box en Rust"}} rust/integer_types -.-> lab-99248{{"Gérer les erreurs avec Box en Rust"}} rust/string_type -.-> lab-99248{{"Gérer les erreurs avec Box en Rust"}} rust/function_syntax -.-> lab-99248{{"Gérer les erreurs avec Box en Rust"}} rust/expressions_statements -.-> lab-99248{{"Gérer les erreurs avec Box en Rust"}} rust/method_syntax -.-> lab-99248{{"Gérer les erreurs avec Box en Rust"}} rust/traits -.-> lab-99248{{"Gérer les erreurs avec Box en Rust"}} rust/operator_overloading -.-> lab-99248{{"Gérer les erreurs avec Box en Rust"}} end

Encapsulation des erreurs avec Box

Un moyen d'écrire un code simple tout en conservant les erreurs originales est d'encapsuler les erreurs avec Box. Le inconvénient est que le type d'erreur sous-jacent n'est connu que pendant l'exécution et n'est pas déterminé statiquement.

La bibliothèque standard aide à encapsuler nos erreurs en faisant en sorte que Box implémente la conversion de tout type qui implémente le trait Error en l'objet trait Box<Error>, via From.

use std::error;
use std::fmt;

// Changez l'alias en `Box<error::Error>`.
type Result<T> = std::result::Result<T, Box<dyn error::Error>>;

#[derive(Debug, Clone)]
struct EmptyVec;

impl fmt::Display for EmptyVec {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "invalid first item to double")
    }
}

impl error::Error for EmptyVec {}

fn double_first(vec: Vec<&str>) -> Result<i32> {
    vec.first()
     .ok_or_else(|| EmptyVec.into()) // Convertit en Box
     .and_then(|s| {
            s.parse::<i32>()
             .map_err(|e| e.into()) // Convertit en Box
             .map(|i| 2 * i)
        })
}

fn print(result: Result<i32>) {
    match result {
        Ok(n) => println!("The first doubled is {}", n),
        Err(e) => println!("Error: {}", e),
    }
}

fn main() {
    let numbers = vec!["42", "93", "18"];
    let empty = vec![];
    let strings = vec!["tofu", "93", "18"];

    print(double_first(numbers));
    print(double_first(empty));
    print(double_first(strings));
}

Sommaire

Félicitations ! Vous avez terminé le laboratoire Encapsulation des erreurs avec Box. Vous pouvez pratiquer d'autres laboratoires sur LabEx pour améliorer vos compétences.