Bonjours je suis entrain de suivre le chapitre de la gestion des erreurs dans le cours sur le c++ et je sais que ce cours n'est pas à jours du coup je me demande si c'est normal ce qui m'arrive. mon code :
#include <iostream>
#include <string>
using namespace std;
int division(int a, int b)
{
try
{
if(b == 0)
throw string("division par zero");
else
return a/b;
}
catch(string const& chaine)
{
cerr << chaine << endl;
}
}
int main()
{
int a(6), b(0);
cout << division(a, b) << endl;
return 0;
}
je ne vois pas de problème dans ce code mais quand je l'exécute j'obtiens le résultat suivant :
au lieu de la chaine "ERROR : " qu'est censé me générer le cerr j'obtiens un nombre bizarre dans la console et j'imagine qu'il s'ajoute à la fin du catch puisqu'il y est aussi si mon catch ne fais rien du tout.
merci beaucoup de me répondre j'espère que vous pourrez m'aider.
Tu as de la chance. Quand j'essaie de lancer ce code dans g++, j'ai un crash :
main.cpp: In function 'int division(int, int)':
main.cpp:15:25: warning: control reaches end of non-void function [-Wreturn-type]
catch(string const& chaine)
^~~~~~
division par zero
bash: line 7: 8953 Aborted (core dumped) ./a.out
1. le code n'est pas valide.
2. "cerr" n'est pas (plus ?) sensé affiché "ERROR : " (ou alors, c'est plateforme dependant)
C'est parce qu'en cas d'exception, il n'y a pas de return, avec un compilateur bien configuré tu devrais avoir au minimum un warning. Du coup la valeur de retour n'étant pas initialisé tu obtiens ce qu'il y a dans la ram à cet endroit donc n'importe quoi.
int division(int a, int b)
{
try
{
if(b == 0)
throw string("division par zero");
else
return a/b;
}
catch(string const& chaine)
{
cerr << chaine << endl;
}
return 0; // retourner quelque chose!
}
Le using namespace std, c'est mal.
Ta gestion d'exception n'est pas terrible, d'abord tu devrais préférer lancer une exception dérivée de std::exception, en général c'est std::runtime_error qui est utilisée.
D'autre part, il y a un problème, tu ne catch pas là ou tu pourrais faire quelque chose, et du coup tu es coincé pour la valeur que tu dois retourner.
Il vaudrait mieux faire le try/catch dans le main:
int division(int a, int b)
{
if(b == 0)
throw std::runtime_error{"division par zero"};
else
return a/b;
}
int main()
{
int a{6}, b{0};
try
{
std::cout << division(a, b) << std::endl;
} catch(std::exception const & e)
std::cerr << e.what();
}
return 0;
}
2. "cerr" n'est pas (plus ?) sensé affiché "ERROR : " (ou alors, c'est plateforme dependant)
C'est quoi le role de std::cerr alors? Dans quel cas on doit l'utiliser au lieu de std::cout?
Pour les erreurs.
Ce sont avant tout des flux différents, qui peuvent être capturé de façons différentes dans un terminal ou un editeur et pouvoir faire un traitement particulier sur ce qui est envoyé dans ces flux (enregistrer dans un fichier, afficher a l'ecran, traiter les erreur dans un script, afficher une couleur rouge dans un editeur, etc). https://en.wikipedia.org/wiki/Standard_streams
Donc il est possible de configurer le flux stderr pour afficher "ERROR : " devant les messages si on veut, mais ce n'est pas une obligation.
(Il faudrait que j'ecrive un jour un tuto sur l'utilisation de stderr dans un script bash)
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Discord NaN. Mon site.
Eug
Discord NaN. Mon site.