Rust:
Obsługa błędów
Jak to zrobić:
Rust radzi sobie z błędami na dwa główne sposoby: odzyskiwalne i nieodzyskiwalne błędy. Przyjrzyjmy się obu.
Odzyskiwalne błędy używają Result<T, E>
:
use std::fs::File;
fn open_file(filename: &str) -> Result<File, std::io::Error> {
let f = File::open(filename);
match f {
Ok(file) => Ok(file),
Err(e) => Err(e),
}
}
fn main() {
match open_file("hello.txt") {
Ok(_file) => println!("Plik otwarty pomyślnie."),
Err(_e) => println!("Nie udało się otworzyć pliku."),
}
}
Wynik może być albo “Plik otwarty pomyślnie.” albo “Nie udało się otworzyć pliku.” w zależności od Twojego hello.txt
.
Dla nieodzyskiwalnych błędów używamy panic!
:
fn main() {
// To spowoduje panikę programu, bo prawdopodobnie plik nie istnieje.
let _f = File::open("nowhere.txt").unwrap();
}
Uruchom to, a zobaczysz komunikat o panice. Twój program zatrzyma się w miejscu.
Głębsze spojrzenie
Historycznie, obsługa błędów w programowaniu była bałaganem. Rust robi to dobrze, jasno rozróżniając odzyskiwalne i nieodzyskiwalne błędy.
Enum Result
jest dla odzyskiwalnych błędów. Jest to jasne – obsługujesz wariant Ok
lub Err
. Masz też metody takie jak unwrap()
czy expect()
, ale są to szybkie i brudne skróty, które mogą prowadzić do panic!
.
panic!
to sposób Rusta na oznajmienie, że stało się coś naprawdę złego i nie potrafi sobie z tym poradzić. To jak nieodzyskiwalny błąd, który natychmiast zatrzymuje wykonanie programu. Panika w Rust jest często odczuwana z błędami, których nie spodziewasz się obsłużyć, na przykład przy indeksowaniu poza granice tablicy.
Obsługa błędów poprzez zwracanie Result
jest preferowaną metodą, gdy spodziewasz się radzenia sobie z błędami. To idiomatyczny Rust, co oznacza, że to sposób, na który zgodzili się programiści Rust. Jest jeszcze Option<T>
dla sytuacji, kiedy błąd to po prostu coś jest None
zamiast Some(T)
. Chodzi o to, aby oczekiwać niespodziewanego bez strachu.
Alternatywy? Jasne, możesz użyć innych crate’ów do obsługi błędów dla większych funkcji lub ergonomicznego użytku. Na przykład anyhow
dla prostych błędów, lub thiserror
dla błędów w kodzie bibliotek.
Zobacz również
Zainteresowany głębszym zanurzeniem? Oto, gdzie możesz się udać:
- Rust Book on Error Handling - Świetne miejsce do zrozumienia filozofii obsługi błędów w Rust.
- Rust by Example: Error handling - Interaktywne przykłady, abyś mógł pobrudzić ręce.
Pamiętaj, dobra obsługa błędów to nie tylko kodowanie; to dbanie o użytkowników Twojego kodu. Szczęśliwego kodowania!