[C++] fonctions try et catch

Résolu/Fermé
CQFD - 13 juin 2009 à 16:24
mamiemando Messages postés 33654 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2025 - 14 juin 2009 à 18:47
Bonjour,

je n'arrive pas à résoudre cet exercice.
Il s"agit d'un programme C++ où il faut déterminer le résultat de l'éxécution d'une fonction.

Cette fonction se nomme LancerExceptions( ).

Malheureusement, j'étais absent pendant cette période, et toute cette syntaxe m'embrouille un peu :-)
Auriez-vous l'aimabilité de m'aider à résoudre l'exercice ci-dessous ?

Bien sur, je ne vous demande pas de faire le travail à ma place. Simplement une piste, un début d'idée...

Merci d'avance.


#include <iostream>
#include <string>
#include <stdexcept>

class Eleve
{
          public :
               Eleve( );
};

class EleveX
{
          public :
               EleveX( );
};

class Maitre
{
               Eleve sonEleve;
               char sonIdentifiant;
          public :
               EleveX sonEleveX;
               Maitre(char Identifiant);
}

classe MaitreX : public Maitre
{
               double sonNombre;
          public :
               MaitreX(double Nombre);
               ~MaitreX( );
};


Eleve::Eleve( )
{
          std::cout << "Construction d'un eleve" << std::endl;
}

EleveX::~EleveX( )
{
          std::cout << "Destruction d'un eleveX" << std::endl;
}

Maitre::Maitre(char Identifiant)
: sonIdentifiant(Identifiant)
{
          std::cout << "Construction d'un maitre : " << sonIdentifiant << std::endl;
          if(sonIdentifiant < 'A' || sonIdentifiant > 'Z')
               throw std::domain_error("L'identifiant n'est pas une lettre");
          else
               std::cout << "L'identifiant est une lettre" << std::endl;
}

MaitreX::MaitreX(double Nombre)
: Maitre('Z'), sonNombre(Nombre)
{
          std::cout << "Construction d'un maitreX : " << sonD << std::endl;
}

MaitreX::~MaitreX( )
{
          std::cout << "Destruction d'un maitreX" << std::endl;
}


void tester(char p)
{
          try
          {
                    Maitre Maitre2(p);
                    try
                    {
                         if (p <= 'Z') throw (p <= 'Z');
                         else
                         {
                              std::cout << "OK" << std::endl;
                         }
                    }

                    catch(std::domain_error & uneException)
                    {
                         std::cout << "ErreurTypeA : " << uneException.what( ) << std::endl;
                         test('Z');
                    }
          }

          catch(std::domain_error & uneException)
          {
               std:cout << "ErreurTypeB : " << uneException.what( ) << std::endl;
               test('A');
          }
}


void lancerExceptions( )
{
          try
          {
               MaitreX MaitreX1(3.25);
               test('0');
          }

          catch(bool & exception)
          {
               std::cout << "Exception bool !" << std::endl;
          }
}

5 réponses

mamiemando Messages postés 33654 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2025 7 847
14 juin 2009 à 02:11
Petit rappel de cours. En C++ une fonction est quittée a priori par un point de sortie, a priori un return (éventuellement l'accolade fermante de la fonction si cette fonction ne retourne rien).

Toute fois il est possible d'interrompre l'exécution d'une fonction f en levant une erreur (à l'aide d'un throw). On n'est pas obligé de mettre une erreur à la suite du throw. La fonction g qui a appelé la fonction f est a priori sensée englober l'appel de f avec un bloc try catch, sinon le programme est interrompu.

- Quand aucune erreur n'est levée, le bloc try est intégralement exécuté et le(s) catch(s) associé(s) est (sont)
ignoré(s).

- Si une erreur est levé, le bloc try est interrompu (les instructions après f sont ignorées) et l'on rentre dans le bloc catch qui correspond à l'erreur levé. Il est possible de faire un "catch" par défaut quand tous les catch du bloc try catch n'ont pas rattrapé l'erreur : celui ci est noté catch(...).
try{
  //...
  f();
  //...
}catch(type_err1 & e1){
  // ...
}catch(type_err2 & e2){
  //...
}catch(...){ // catch les erreurs non rattrapées
  //
}

Maintenant il ne te reste plus qu'à copier coller ton code dans un environnement de développement C++ (par exemple code::blocks ou dev-cpp sous windows et kdevelop ou anjuta sous linux) et regarder ce qui se passe.

Bonne chance
2
Por favor ! :-)
0
Please ! :-)

Merci d'avance.
0
Merci pour toutes vos explications, Mamiemando.

Mon problème est résolu, je viens d'éxécuter le programme avec Code::Blocks.

Bonne journée.
http://www.attentionauchien.com/images/ecards/merci.jpg
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mamiemando Messages postés 33654 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2025 7 847
14 juin 2009 à 18:47
Parfait, bonne continuation
0

Discussions similaires