Fehlerbehandlung mit Box in Rust

RustRustBeginner
Jetzt üben

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

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab zeigt der Code, wie man den Box-Typ verwendet, um ursprüngliche Fehler zu bewahren, indem man sie umschließt, um eine dynamische Fehlerbehandlung zu ermöglichen. Das From-Attribut der Std-Bibliothek hilft dabei, beliebige Typen, die das Error-Attribut implementieren, in das Attributobjekt Box<Error> umzuwandeln. Es enthält ein Beispiel zur Umwandlung und Behandlung von Fehlern mit Box mit einem benutzerdefinierten Fehlertyp.

Hinweis: Wenn das Lab keinen Dateinamen angibt, können Sie einen beliebigen Dateinamen verwenden. Beispielsweise können Sie main.rs verwenden und es mit rustc main.rs &&./main kompilieren und ausführen.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL 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(("Rust")) -.-> rust/AdvancedTopicsGroup(["Advanced Topics"]) 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{{"Fehlerbehandlung mit Box in Rust"}} rust/integer_types -.-> lab-99248{{"Fehlerbehandlung mit Box in Rust"}} rust/string_type -.-> lab-99248{{"Fehlerbehandlung mit Box in Rust"}} rust/function_syntax -.-> lab-99248{{"Fehlerbehandlung mit Box in Rust"}} rust/expressions_statements -.-> lab-99248{{"Fehlerbehandlung mit Box in Rust"}} rust/method_syntax -.-> lab-99248{{"Fehlerbehandlung mit Box in Rust"}} rust/traits -.-> lab-99248{{"Fehlerbehandlung mit Box in Rust"}} rust/operator_overloading -.-> lab-99248{{"Fehlerbehandlung mit Box in Rust"}} end

Fehler in eine Box packen

Ein Weg, einfachen Code zu schreiben, während man die ursprünglichen Fehler beibehält, besteht darin, sie in eine Box zu packen. Der Nachteil ist, dass der zugrunde liegende Fehlertyp nur zur Laufzeit bekannt ist und nicht statisch bestimmt werden kann.

Die Standardbibliothek hilft uns dabei, unsere Fehler in eine Box zu packen, indem Box die Umwandlung von jedem Typ, der das Error-Attribut implementiert, in das Attributobjekt Box<Error> über From implementiert.

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

// Ändern Sie den Alias in `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, "ungültiges erstes Element zum Verdoppeln")
    }
}

impl error::Error for EmptyVec {}

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

fn print(result: Result<i32>) {
    match result {
        Ok(n) => println!("Das erste verdoppelt ist {}", n),
        Err(e) => println!("Fehler: {}", 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));
}

Zusammenfassung

Herzlichen Glückwunsch! Sie haben das Lab "Fehler in eine Box packen" abgeschlossen. Sie können in LabEx weitere Labs ausprobieren, um Ihre Fähigkeiten zu verbessern.