Partage
  • Partager sur Facebook
  • Partager sur Twitter

mon catch écris un nombre dans la console

    24 septembre 2018 à 12:07:13

    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.

    • Partager sur Facebook
    • Partager sur Twitter
      24 septembre 2018 à 12:14:33

      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)

      3. c'est idiot d'utiliser un try-catch comme ca

      4...

      • Partager sur Facebook
      • Partager sur Twitter
        24 septembre 2018 à 12:23:38

        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;
        }



        • Partager sur Facebook
        • Partager sur Twitter
        Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug
          24 septembre 2018 à 12:27:27

          gbdivers a écrit:

          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?
          • Partager sur Facebook
          • Partager sur Twitter

          Eug

            24 septembre 2018 à 12:36:02

            ok j'ai compris merci beaucoup pour ta réponse
            • Partager sur Facebook
            • Partager sur Twitter
              24 septembre 2018 à 12:40:38

              eugchriss a écrit:

              gbdivers a écrit:

              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)

              -
              Edité par gbdivers 24 septembre 2018 à 12:42:05

              • Partager sur Facebook
              • Partager sur Twitter

              mon catch écris un nombre dans la console

              × 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.
              • Editeur
              • Markdown