Il existe plusieurs façons de gérer les erreurs dans Rust, alors assurez-vous de considérer toutes les options.

Les erreurs sont inévitables et peuvent survenir pour diverses raisons, allant d'une entrée utilisateur invalide à des pannes de réseau, des dysfonctionnements matériels ou des bogues de programmation. La gestion des erreurs est le processus de détection, de signalement et de récupération de ces erreurs afin d'éviter les plantages du programme ou la corruption des données.

Une gestion efficace des erreurs est essentielle dans Rust. Il vous permet de créer des applications robustes et fiables capables de gérer les erreurs et les échecs inattendus. Les mécanismes de gestion des erreurs de Rust vous permettent de développer des programmes résilients et sécurisés, plus faciles à entretenir.

Les types d'erreurs dans Rust

Rust a un système de type riche que vous pouvez utiliser pour gérer les erreurs avec compétence, selon leurs types. Les avantages du système de type d'erreur riche de Rust par rapport aux approches traditionnelles de gestion des erreurs ne peuvent être sous-estimés. Le système de type d'erreur fournit

instagram viewer
sécurité de type améliorée, composabilité, expressivité et débogabilité.

Voici une liste des types d'erreurs courantes dans Rust :

  • Le std:: io:: Erreur type représente les erreurs d'E/S telles que fichier introuvable, autorisation refusée ou fin de fichier atteinte.
  • Le std:: num:: ParseIntError type représente les erreurs qui se produisent lors des opérations d'analyse de chaîne en nombre entier.
  • Le std:: option:: Aucune erreur type représente les erreurs de déballage des options vides.
  • Le std:: résultat:: Résultat type est un type de résultat générique que vous pouvez utiliser pour représenter n'importe quelle erreur.

Chaque type d'erreur a son propre ensemble de méthodes et de caractéristiques pour le gérer de manière spécifique.

Voici un exemple de gestion d'erreur dans Rust pour une opération de lecture de fichier :

utiliser std:: fs:: Fichier ;
utiliser std:: io:: Lire ;

fnlire_fichier(chemin: &chaîne) -> Résultat<Chaîne, std:: io:: Erreur> {
laissermuet fichier = Fichier:: ouvrir (chemin)? ;
laissermuet contenu = Chaîne::nouveau();
file.read_to_string(&muet Contenu)?;
D'accord(Contenu)
}

Le lire_fichier La fonction lit le contenu du fichier dans le chemin spécifié et le renvoie sous forme de chaîne. Il renvoie un std:: io:: Erreur si l'opération d'ouverture ou de lecture du fichier échoue. Le ? L'opérateur propage l'erreur et renvoie l'erreur sous la forme d'un Résultat.

Mécanismes de gestion des erreurs dans Rust

Une caractéristique clé qui contribue à la sécurité de Rust est ses mécanismes de gestion des erreurs. Il existe quatre principaux mécanismes de gestion des erreurs dans Rust: Résultat tapez le Option tapez le panique! macro, et la Erreur trait.

Les types Résultat et Option permettent une gestion structurée des erreurs. Vous pouvez utiliser la panique! macro pour gérer les erreurs irrécupérables. Le trait Erreur vous permet de définir des types d'erreurs personnalisés et une gestion des erreurs personnalisée.

Le type de résultat

Le Résultat type est un type intégré représentant le résultat d'une opération qui peut échouer. Il a deux variantes: la D'accord variant, qui représente le succès et contient une valeur, et Se tromper, qui représente un échec et contient une valeur d'erreur.

Voici comment vous pouvez utiliser le type Result pour ouvrir un fichier et lire son contenu :

utiliser std:: fs:: Fichier ;
utiliser std:: io:: prélude ::*;

fnlire_fichier(chemin du fichier: &chaîne) -> Résultat<Chaîne, std:: io:: Erreur> {
laissermuet fichier = Fichier:: ouvrir (chemin_fichier)? ;
laissermuet contenu = Chaîne::nouveau();
file.read_to_string(&muet Contenu)?;
D'accord(Contenu)
}

fnprincipal() {
laisser résultat = lire_fichier("fichier.txt");

correspondre résultat {
D'accord(contenu) => imprimez !("{}", Contenu),
Se tromper(e) => imprimez !("Erreur: {}", e),
}
}

Le lire_fichier fonction prend le chemin du fichier et renvoie un Résultat erreur. Si l'opération de lecture ou d'ouverture de fichier échoue, la fonction renvoie le Se tromper valeur. Sinon, la fonction renvoie le D'accord valeur. Dans le principal fonction, la correspondre l'instruction gère Résultat valeur et imprime le résultat en fonction de la situation de l'opération sur le fichier.

Le type d'option

Le Option type est un type intégré représentant la présence ou l'absence d'une valeur. Le Option type a deux variantes. Quelques représente une valeur, et Aucun représente l'absence de valeur.

Voici comment vous pouvez utiliser le Option type pour récupérer le premier élément d'un vecteur.

fnget_first_elementCloner>(vec: Vec) -> Option {
si vec.is_empty() {
Aucun
} autre {
Quelques(vec.first().unwrap().clone())
}
}

fnprincipal() {
laisser ve = vec![1, 2, 3];
laisser résultat = get_first_element (vec);

correspondre résultat {
Quelques(élément) => imprimez !("{}", élément),
Aucun => imprimez !("Le vecteur est vide."),
}
}

Le get_first_element la fonction renvoie un Option taper. Si le vecteur est vide, la fonction retourne Aucun; sinon la fonction retourne Quelques contenant le premier élément du vecteur. Dans le principal fonction, la correspondre l'instruction gère Option valeur. Si la Option évalue à Quelques, la fonction imprime le premier élément. Sinon, la fonction imprime un message indiquant que le vecteur est vide.

La panique! Macro

Le panique! La macro fournit des fonctionnalités pour gérer les erreurs irrécupérables dans Rust. En appelant le panique! macro, elle imprime un message d'erreur et termine le programme.

Voici un exemple d'utilisation de la panique! macro pour indiquer qu'une fonction a des arguments invalides.

fndiviser(dividende: f64, diviseur: f64) -> f64 {
si diviseur == 0.0 {
panique!("Le diviseur ne peut pas être zéro.");
}

dividende / diviseur
}

fnprincipal() {
laisser résultat = diviser(4.0, 0.0);
imprimez !("{}", résultat);
}

Le diviser la fonction vérifie si le diviseur est zéro; si le diviseur est nul, la fonction appelle le panique! macro avec un message d'erreur; sinon, la fonction calcule et renvoie le résultat

Le principal la fonction appelle la fonction de division avec des arguments non valides pour déclencher la panique! macro.

Voici le message d'erreur :

Le trait d'erreur

Le Erreur trait est un trait intégré qui définit le comportement des types d'erreur. Le Erreur trait fournit des fonctionnalités pour définir des types d'erreurs personnalisés et une gestion des erreurs personnalisée.

Voici un exemple de définition d'un type d'erreur personnalisé qui représente une erreur de fichier introuvable.

utiliser std:: erreur:: erreur ;
utiliser std:: fmt;
utiliser std:: io:: Lire ;

#[dériver (débogage)]
structureFichier introuvable(Chaîne);

mettre en œuvre fmt:: Affichage pour Fichier introuvable {
fnfmt(&soi, F: &muet fmt:: Formateur) -> fmt ::Résultat {
écrire!(F, "Fichier introuvable: {}", soi.0)
}
}

mettre en œuvre Erreur pour Fichier introuvable {}

fnlire_fichier(chemin du fichier: &chaîne) -> Résultat<Chaîne, Boîte<dynamique Erreur>> {
laissermuet file = std:: fs:: File:: open (file_path).map_err(|e| FileNotFound(format!("{}", e)))? ;
laissermuet contenu = Chaîne::nouveau();
file.read_to_string(&muet Contenu)?;
D'accord(Contenu)
}

fnprincipal() {
laisser résultat = lire_fichier("fichier.txt");

correspondre résultat {
D'accord(contenu) => imprimez !("{}", Contenu),
Se tromper(e) => imprimez !("Erreur: {}", e),
}
}

Le type d'erreur personnalisé est le Fichier introuvable structure. Le type contient un chemin de fichier et le Fichier introuvable type implémente le Afficher trait pour renvoyer des messages d'erreur conviviaux et le Erreur trait pour indiquer qu'il s'agit d'un type d'erreur.

Dans le lire_fichier fonction, la Fichier introuvable le type d'erreur représente une erreur de fichier introuvable, et le map_err convertit l'erreur std:: io:: Error en une erreur FileNotFound. Enfin, la boîte type permet à la fonction de renvoyer tout type qui implémente le trait Error.

Le principal la fonction appelle le lire_fichier fonctionne avec le chemin du fichier et, s'il trouve le fichier, imprime son contenu sur la console. Sinon, il imprime le message d'erreur.

Voici le résultat pour un fichier qui n'existe pas :

Vous pouvez miser sur le modèle de propriété de Rust pour la sécurité du programme

Couplé au magnifique mécanisme de gestion des erreurs de Rust, Rust utilise également un modèle de propriété qui permet de garantir que vos programmes sont sécurisés en mémoire.

Rust garantit les règles de propriété avec un vérificateur d'emprunt au moment de la compilation avant l'exécution de votre programme.