69 lines
2.1 KiB
Markdown
69 lines
2.1 KiB
Markdown
![]() |
---
|
||
|
title: "Teil 2: Result Typ und Fehlerbehandlung"
|
||
|
date: 2020-09-19
|
||
|
draft: false
|
||
|
series: ["Rust Grundlagen"]
|
||
|
tags: ["rust","programmieren"]
|
||
|
---
|
||
|
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.
|
||
|
|
||
|
```rust
|
||
|
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:
|
||
|
|
||
|
```rust
|
||
|
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...
|
||
|
|