</>
Plan du cours — 24/66

Result : la gestion d'erreurs récupérables

Intermédiaire

Rust 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}"))?;