Menu
Coddy logo textTech

Le gestionnaire d'exceptions générique

Fait partie de la section Logique et Flux du Journey C++ de Coddy. Leçon 52 sur 56.

Parfois, votre programme peut rencontrer des erreurs inattendues qui ne correspondent pas aux types d’exceptions spécifiques que vous aviez prévus. Le gestionnaire fourre-tout catch(...) constitue un filet de sécurité qui intercepte toute exception qui n’a pas été gérée par vos blocs catch plus spécifiques.

Le gestionnaire général utilise trois points (...) au lieu de spécifier un type d'exception particulier. Il doit être placé après tous les autres blocs catch, puisque C++ les vérifie dans l'ordre :

try {
    // Code qui pourrait lever diverses exceptions
} catch (std::invalid_argument& e) {
    std::cout << "Invalid input!" << std::endl;
} catch (std::out_of_range& e) {
    std::cout << "Number too large!" << std::endl;
} catch (...) {
    std::cout << "An unexpected error occurred!" << std::endl;
}

Le gestionnaire catch-all sert de solution de secours pour tout type d’exception qui n’a pas été intercepté par les blocs précédents. Il est particulièrement utile lorsque vous travaillez avec du code susceptible de lever des exceptions que vous n’aviez pas anticipées, afin d’éviter que votre programme ne plante à cause d’erreurs inattendues.

Bien que vous ne puissiez pas accéder aux détails spécifiques de l’exception dans un bloc catch-all, vous pouvez tout de même fournir un message d’erreur générique et effectuer des opérations de nettoyage afin que votre programme continue de fonctionner correctement.

challenge icon

Défi

Facile

Créez un programme qui démontre une gestion complète des exceptions à l’aide de plusieurs blocs catch, y compris un gestionnaire fourre-tout. Ce défi permettra de vérifier votre compréhension de la gestion des types d’exceptions spécifiques ainsi que des erreurs inattendues qui n’entrent pas dans les catégories prédéfinies.

Les entrées suivantes seront fournies :

  • Une chaîne testType représentant le type de test à effectuer ("string_convert", "math_operation", "array_access" ou "unknown_error")
  • Une chaîne value1 qui sera utilisée comme donnée principale pour l’opération
  • Une chaîne value2 qui sera utilisée comme donnée secondaire pour certaines opérations

Votre programme doit :

  1. Créer une fonction nommée performTest qui prend trois paramètres de type chaîne
  2. À l’intérieur de la fonction, utiliser une structure if-else pour gérer les différents types de tests :
  3. Si testType vaut "string_convert" : utiliser std::stoi pour convertir value1 en entier et l’afficher
  4. Si testType vaut "math_operation" : convertir value1 et value2 en entiers à l’aide de std::stoi, puis diviser value1 par value2 et afficher le résultat
  5. Si testType vaut "array_access" : créer une chaîne "Programming", convertir value1 en indice entier à l’aide de std::stoi, puis utiliser str.at(index) pour accéder au caractère situé à cet indice et l’afficher. La méthode .at() lève automatiquement std::out_of_range si l’indice n’est pas valide : aucune vérification manuelle des limites n’est nécessaire
  6. Si testType vaut "unknown_error" : lever une valeur entière 999
  7. Dans la fonction main, appeler performTest à l’intérieur d’un bloc try
  8. Utiliser plusieurs blocs catch pour gérer les exceptions dans cet ordre exact :
  9. Premièrement : std::invalid_argument& pour les conversions invalides de chaînes en nombres
  10. Deuxièmement : std::out_of_range& pour les nombres trop grands ou les indices de chaîne hors limites
  11. Troisièmement : catch(...) comme gestionnaire fourre-tout pour tout autre type d’exception

Utilisez le format de sortie exact suivant :

Pour les opérations réussies :

Success: [result_value]

Pour les différents types d’exceptions :

Invalid argument caught
Out of range caught
Unknown exception caught

N’oubliez pas que le gestionnaire fourre-tout catch(...) doit être placé en dernier, car C++ vérifie les blocs catch dans l’ordre. Ce gestionnaire interceptera tout type d’exception qui n’a pas été traité par les blocs catch spécifiques précédents, y compris l’exception entière levée dans le cas "unknown_error". Le gestionnaire fourre-tout constitue un filet de sécurité pour les erreurs inattendues, tout en permettant une gestion spécifique des types d’exceptions connus.

Essayez vous-même

#include <iostream>
#include <string>
#include <stdexcept>
using namespace std;

// TODO: Écrivez votre code ici - créez la fonction performTest

int main() {
    // Lire l'entrée
    string testType;
    string value1;
    string value2;
    
    cin >> testType;
    cin >> value1;
    cin >> value2;
    
    // TODO: Écrivez votre code ci-dessous - implémentez les blocs try-catch et appelez performTest
    
    return 0;
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Logique et Flux

Entraînez-vous par vous-même : Compilateur C++ en ligne