Teil 2: Result Typ und Fehlerbehandlung

Heute habe ich einmal mit dem Thema Fehlerbrhandlung rumexperimentiert. Einer mehreren Wegen in Rust ist der Result Typ. Dabei handelt es sich um ein enum, dass entweder einen Wert für den Erfolgsfall oder einen Fehler enthält.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
use std::string::String;

#[derive(Debug)]
struct Person {
    name: String,
    age: i32,
}

impl Person {
    fn hello(&self) -> Result<String, &str>{
        if self.name != "" {
            let ret = format!("{} is {} years old.", self.name, self.age);
            Ok(ret)
        } else {
            Err("No name given")
        }
        
    }
}

fn main() {
    let bob = Person {
        name: String::from("Bob"),
        age: 32,
    };
    let res = bob.hello().unwrap(); // will consume the Ok value or panic in case of error
    println!("{:?}", res);
    
    let mary = Person {
        name: String::from(""),
        age: 30,
    };
    let res1 = mary.hello().unwrap(); // will consume the Ok value or panic in case of error
    println!("{:?}", res1); 
}

Die Rückgabe der Methode hello wird als Result<String, &str> definiert. Innerhalb der if Anweisung geben wir im Erfolgsfall durch Ok(ret) den String zurück. Andernfalls über Err("…") eine Fehlermeldung.

Durch das Anhängen der Methode unwrap() wird der zurückgelieferte Result Typ entpackt. Im Falle eines Fehler führt unwrap() zu einer Panik. Die Ausgabe sieht dann so aus:

1
2
3
4
5
6
7
8
9
Standard Error:
Compiling playground v0.0.1 (/playground)
    Finished dev [unoptimized + debuginfo] target(s) in 1.05s
     Running `target/debug/playground`
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: "No name given"', src/main.rs:33:29
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

Standard Output:
"Bob is 32 years old."

Das ist denke ich erstmal nur der Einstieg. Die Methode unwrap() zu verwenden ist zwar schnell und bequem, aber man will ja in den wenigsten Fällen das Programm mit einer Panik enden lassen, dazu dann nochmal mehr…

0%