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.rsverwenden und es mitrustc main.rs &&./mainkompilieren und ausführen.
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.