Gestion erreur
Résolu
Utilisateur anonyme
-
ElementW Messages postés 5690 Statut Contributeur -
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
fichier.cpp
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);
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
-
'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 deif
à écrire, et que si aucune exception n'est levée, c'est aussi rapide que s'il n'y avait pas deif
de vérif'. Par contre quand il y en a une, c'est 10x~20x plus lent que desif
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-
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 ?- Le
(const std::runtime_error &e)
veut dire "attrapper les erreurs du typestd::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 renvoie1
. (au lieu du0
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 classestd::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; }
-