Gestion erreur

Résolu
Bonjour,

je cherche a gérer intelligemment le retour de mes fonctions pour surveiller que tout fonctionne bien.

mais j'ai un problème technique ...
mes fonctions functionOne(), functionTwo(), functionTree() appartienne a la même class,
j'ai une variable error en private qui vaut 0.
si une erreur ce montre dans l'une des trois fonctions this->error = 1.

fichier.hpp
class  truc
{
private:
   int error;

public:
  truc();
  ~truc();
void  functionOne();
void  functionTwo();
void  functionTree();
};


fichier.cpp
if (this->error == 0)
{
 functionOne();
 functionTwo();
 functionTree();
}
else
  return (1);
return (0);


comment je peut faire pour que , si une erreur arrive dans fonctionOne()
le programme quitte mon if() avant d'entré dans functionTwo() ??

je veut pas utilisé de return() dans mes fonctions, ainsi que évité les if ()
a chaque appel de fonction ...

peut on obtenir quelque chose d’intéressant avec try et catch ?
genre si this->error == 1 alors return(1);

1 réponse

  1. Contributeur
    'lut
    peut on obtenir quelque chose d’intéressant avec try et catch ?
    Justement, try et catch sont là pour ça.
    #include <stdexcept>
    
    // Par exemple
    void truc::functionOne() {
     [...]
     if (blabla) {
      throw std::runtime_error("Nom de Zeus c'est la fin du monde!");
     }
    }
    
    [...]
    try {
     functionOne();
     functionTwo();
     functionTree();
    } catch (const std::runtime_error &e) {
     return 1;
    }
    return 0;
    


    L'avantage c'est qu'il n'y a pas de
    if
    à écrire, et que si aucune exception n'est levée, c'est aussi rapide que s'il n'y avait pas de
    if
    de vérif'. Par contre quand il y en a une, c'est 10x~20x plus lent que des
    if
    en chaîne, donc c'est à utiliser pour des cas "exceptionnels" (erreurs), pas l'exécution normale de ton progamme.
    from human import idiocy
    del idiocy
    1. soulager de voir qu'il existe une solution, merci d'avoir pris le temps de me faire un chouette exemple. je n'est jamais utilisé le try- catch.

      je comprend la partie try , qui englobe les fonctions susceptible de générer des erreurs.
      je crois comprendre que catch agis comme un else qui suivrais un if non valide ?
      mais je comprend pas le reste ...
      le (const std::runtime_error &e) et la partie intra-fonction .

      dans ton exemple tu définie un message d'erreur qui s'affiche si il il y en a une, mais si je veut a la place ne rien afficher, je peut ?
    2. Contributeur
      @Utilisateur anonymeLe
      (const std::runtime_error &e)
      veut dire "attrapper les erreurs du type
      std::runtime_error
      et les nommer "
      e
      " lors du traitement de l'erreur". Ce que tu mets dans le bloc de code qui suit est justement la gestion de l'exception; ici on renvoie
      1
      . (au lieu du
      0
      qui aurait été exécuté sinon).

      Dans une fonction, on signale/lève/envoie/créé une erreur/exception via le mot-clé
      throw
      .

      Mon exemple n'affiche aucun message d'erreur. Ceci dit j'utilise la classe
      std::runtime_error
      pour indiquer la nature de mon erreur, et créer une instance de cette classe demande de spécifier une chaîne de caractères descriptive, qu'on peut récupérer après. Exemple; si je voulais afficher l'erreur en plus de la logique actuelle:
      [...]
      } catch (const std::runtime_error &e) {
       std::cout << "Erreur intercetée! Message: " << e.what() << std::endl;
       return 1;
      }