La gestion des erreurs en Rust

Ces exercices portent sur Option, Result, panic! et l'opérateur ?. Faites-les dans l'ordre.

Division sûre

Diviser deux entiers, en renvoyant une erreur explicite si le diviseur est nul.

  • Objectif : Result<T, E>, variantes Ok / Err.
  • Signature suggérée : fn div(a: i32, b: i32) -> Result<i32, String>.
  • Cas de test : div(10, 2) -> Ok(5), div(7, 0) -> Err(...) (message au choix).

Premier élément

Renvoyer le premier élément d'un slice, ou rien s'il est vide - sans indexer directement (v[0] paniquerait sur un slice vide).

  • Objectif : Option<T>, .first() ou match.
  • Signature suggérée : fn premier(v: &[i32]) -> Option<i32>.
  • Cas de test : premier(&[3, 1, 2]) -> Some(3), premier(&[]) -> None.

Parser une durée "mm:ss"

Convertir une chaîne de la forme "mm:ss" en nombre de secondes. Renvoyer None si le format est invalide.

  • Objectif : str::split, str::parse (qui renvoie un Result), passage Result -> Option avec .ok(), opérateur ? sur une Option.
  • Signature suggérée : fn parse_mmss(s: &str) -> Option<u32>.
  • Cas de test : parse_mmss("03:45") -> Some(225), parse_mmss("00:00") -> Some(0), parse_mmss("bonjour") -> None, parse_mmss("3:60:00") -> None.

Erreur typée

Définir enum RacineErreur { Negatif } et fn isqrt(n: i64) -> Result<i64, RacineErreur> qui renvoie la partie entière de la racine carrée, ou Err(RacineErreur::Negatif) si n est négatif.

  • Objectif : type d'erreur dédié (enum) plutôt qu'une String.
  • Signature suggérée : fn isqrt(n: i64) -> Result<i64, RacineErreur>.
  • Cas de test : isqrt(16) -> Ok(4), isqrt(17) -> Ok(4), isqrt(-1) -> Err(RacineErreur::Negatif).

Chaîner avec ?

Écrire fn somme_deux(a: &str, b: &str) -> Result<i32, std::num::ParseIntError> qui parse deux chaînes en i32 et renvoie leur somme, en utilisant ? sur chaque parse.

  • Objectif : ? sur Result, propagation d'erreur, type d'erreur commun.
  • Signature suggérée : fn somme_deux(a: &str, b: &str) -> Result<i32, std::num::ParseIntError>.
  • Cas de test : somme_deux("2", "3") -> Ok(5), somme_deux("2", "x") -> Err(...).