</>
Plan du cours — 25/66

Erreurs personnalisées

Intermédiaire
use std::fmt;

#[derive(Debug)]
enum AppError {
    Io(std::io::Error),
    Parse(std::num::ParseIntError),
    Validation(String),
}

impl fmt::Display for AppError {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        match self {
            AppError::Io(e) => write!(f, "E/S : {e}"),
            AppError::Parse(e) => write!(f, "parsing : {e}"),
            AppError::Validation(m) => write!(f, "validation : {m}"),
        }
    }
}

impl std::error::Error for AppError {}

// From permet à `?` de convertir automatiquement les erreurs
impl From<std::io::Error> for AppError {
    fn from(e: std::io::Error) -> Self { AppError::Io(e) }
}
impl From<std::num::ParseIntError> for AppError {
    fn from(e: std::num::ParseIntError) -> Self { AppError::Parse(e) }
}

Astuce : écrire tout ça à la main est verbeux. En pratique, on utilise thiserror (erreurs de bibliothèque) et anyhow (erreurs d'application) — voir le chapitre Librairies populaires.