Gestion erreur

Résolu/Fermé
Utilisateur anonyme - Modifié par astrocurieux le 3/07/2016 à 17:38
ElementW Messages postés 4814 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 - 3 juil. 2016 à 21:26
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);


A voir également:

1 réponse

ElementW Messages postés 4814 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 227
Modifié par gravgun le 3/07/2016 à 18:52
'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
Utilisateur anonyme
3 juil. 2016 à 19:50
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
ElementW Messages postés 4814 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 227 > Utilisateur anonyme
3 juil. 2016 à 21:26
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