Gestion erreur

Résolu
Utilisateur anonyme -  
ElementW Messages postés 5690 Statut Contributeur -
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. ElementW Messages postés 5690 Statut Contributeur 1 293
     
    '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
    0
    1. Utilisateur anonyme
       
      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 ?
      0
      1. ElementW Messages postés 5690 Statut Contributeur 1 293 > Utilisateur anonyme
         
        Le
        (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;
        }
        0