Result : la gestion d'erreurs récupérables
IntermédiaireRust n'a pas d'exceptions. Une fonction qui peut échouer renvoie Result<T, E>.
use std::fs;
use std::num::ParseIntError;
fn lire_nombre(s: &str) -> Result<i32, ParseIntError> {
s.trim().parse::<i32>()
}
match lire_nombre("42") {
Ok(n) => println!("{n}"),
Err(e) => println!("erreur : {e}"),
}
L'opérateur ?#
? propage l'erreur à l'appelant (retour anticipé), ou déballe la valeur Ok.
use std::io;
fn lire_config(chemin: &str) -> Result<String, io::Error> {
let contenu = fs::read_to_string(chemin)?; // renvoie l'erreur si ça échoue
Ok(contenu.trim().to_string())
}
// unwrap / expect : paniquent en cas d'erreur — réservés aux prototypes,
// tests, ou cas où l'échec est vraiment impossible
let n: i32 = "42".parse().unwrap();
// Alternatives sûres
let n = "abc".parse::<i32>().unwrap_or(0);
let n = "abc".parse::<i32>().unwrap_or_default();
let n = "42".parse::<i32>().map_err(|e| format!("invalide : {e}"))?;