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>, variantesOk/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()oumatch. - 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 unResult), passageResult->Optionavec.ok(), opérateur?sur uneOption. - 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 :
?surResult, 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(...).