IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Erreur de runtime sur un try ... catch


Sujet :

C++

  1. #1
    Membre éclairé
    Avatar de Floréal
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 456
    Points : 849
    Points
    849
    Par défaut Erreur de runtime sur un try ... catch
    Voila donc un bout de mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        try
        {
            Case* maCase = new Case(3);
            bool test;
            test = maCase->passable(3);
        }
        catch(Laby_Exception X)
        {
            sprintf (msg, "Erreur: %s\n", X.message());
            MessageBox(0, msg, "Erreur", MB_ICONHAND);
        }
    Il s'agit d'un bout de code dans lequel je teste une levée d'exception que j'ai moi même créé. J'utilise un compilateur mingw avec dev-C++ et pourtant je ne sais pas comment, mais j'arrive à obtenir ce message:

    Pourquoi est-ce que c'est visual C++ qui s'en mèle alors que je ne l'ai même pas installé sur ma machine?
    Pourquoi mon gestionnaire d'erreur ne fonctionne-t'il pas comme il le devrait?
    Ancien membre du projet "Le Dernier Âge".

  2. #2
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 750
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    Ce n'est pas VC++, mais le runtime de VC++ (la CRT). Les programmes compilés avec MingW sont liés à msvcrt, la CRT de VC++ 6 livrée en standard dans Windows.
    A priori, y'a une exception non catchée dans ton code. Du coup la CRT tue ton application.

  3. #3
    Membre éclairé
    Avatar de Floréal
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 456
    Points : 849
    Points
    849
    Par défaut
    D'accord, merci... mais très franchement, je ne vois pas ou peut être l'erreur.
    Ah, et impossible de debuguer ou de faire du pas à pas, il se fiche completement de mes points d'arret.
    Edit: Il semblerait que ce soit la définition du pointeur maCase qui pose problème. Pourtant je n'ai pas d'erreur à la compilation. C'est louche
    Ancien membre du projet "Le Dernier Âge".

  4. #4
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 750
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    Si autre chose qu'une exception (fille de) Laby_Exception est levée, c'est normal que ça finisse comme ça.
    Note qu'il faut catcher par référence:
    http://c.developpez.com/faq/cpp/?pag...IONS_reference
    tu as peut être un problème dans le constructeur par recopie de ta classe Laby_Exception...

  5. #5
    Membre éclairé
    Avatar de Floréal
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 456
    Points : 849
    Points
    849
    Par défaut
    Ah, tien, oui, ca marche merci, c'etait une erreur de "syntaxe" (que j'avais mal compris d'ailleurs)
    Voila comment je levais mon exception:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    throw(new Laby_Exception(__LABY_EX_INTERVALE_DIRECTIONS__));
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    throw Laby_Exception(__LABY_EX_INTERVALE_DIRECTIONS__);
    Donc je n'ai plus cette message... par contre, maintenant, mon programme se termine pas comem il le faudrait. Je vais voir ce que je peux faire. Merci pour l'aide apportée.
    Ancien membre du projet "Le Dernier Âge".

  6. #6
    Membre éclairé
    Avatar de Floréal
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 456
    Points : 849
    Points
    849
    Par défaut
    Bon, donc j'ai finit par me rapprocher de ce que je voulais en suivant le tutorial. Je réussi donc à récuperer l'exception avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        catch(const std::exception X)
    L'ennui c'est que lorsque j'appelle la méthode what(), j'obtiens un message: "st9exception" au lieu des messages que j'attendais.
    Lorsque je la récupère comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        catch(const std::exception & X)
    Mon programme s'arrête instantannément.


    Voici la définition de ma classe d'exception:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
        class Laby_Exception : public std::exception
        {
            private:
                std::string msg;
     
            public:
                virtual const char * what() const throw();
                /*  retourne un message correspondant au code
                    */
     
                Laby_Exception(const char * Msg) throw();
                /*  constructeur
                    */
     
                ~Laby_Exception() throw();
        };
    les méthodes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        Laby_Exception::Laby_Exception(const char * Msg) throw()
        {
            std::ostringstream oss;
            oss << Msg;
            this->msg = oss.str();
        }
     
        Laby_Exception::~Laby_Exception() throw() {}
     
        const char * Laby_Exception::what() const throw()
        {
            return this->msg.c_str();
        }
    J'ai toujours du mal à saisir le problème, si quelqu'un pouvait m'aiguiller...
    Ancien membre du projet "Le Dernier Âge".

  7. #7
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 750
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    Chez moi, ce code affiche bien "coucou":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    class Laby_Exception : public std::exception 
    { 
    private: 
        std::string msg; 
     
    public: 
        virtual const char * what() const throw();        
        Laby_Exception(const char * Msg) throw(); 
        ~Laby_Exception() throw(); 
    }; 
     
    Laby_Exception::Laby_Exception(const char * Msg) throw() 
    { 
        this->msg = Msg;
    } 
     
    Laby_Exception::~Laby_Exception() throw() {} 
     
    const char * Laby_Exception::what() const throw() 
    { 
        return this->msg.c_str(); 
    } 
     
    void test()
    {
        try
        {
            throw Laby_Exception( "coucou" );
        }
        catch(const std::exception & X)
        {
            cout << X.what() << '\n';
        }
    }
    Au passage, tu n'as pas besoin du ostringstream dans le constructeur.

  8. #8
    Membre éclairé
    Avatar de Floréal
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 456
    Points : 849
    Points
    849
    Par défaut
    De cette manière, oui... j'essaye de voir ce que ca donne avec une utilisation "normale" de mon programe.

    Edit: Ok, en fait, je crois bien avoir omis quelque chose dans l'explication de mon problème. En fait, mon exception doit être lancée si un "mauvais" paramètre est passé dans laméthode d'une autre clasee.
    Voici le topo:
    Un labyrinthe est constitué de plusieurs cases. une case comporte 4 direction. Pour simboliser ces directions, j'utilise un char (un entier sur 8 bits si bous preferez) et chaque bit est attribué à une direction. ainsi on utilise 4 bits (en partant du bit dont le poids est le plus faible:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    +-----------------------------+-------+-------+-------+-------+
    | Direction:                  |  Nord | Ouest |   Sud |   Est |
    +-----------------------------+-------+-------+-------+-------+
    | Bit correspondant:          |    d0 |    d1 |    d2 |    d3 |
    | nb correspondant au bit:    |     1 |     2 |     4 |     8 |
    +-----------------------------+-------+-------+-------+-------+
    j'ai donc une méthode de ma classe cas qui m'indique si on peu se déplacer dans une direction ou non.
    il faut donc que l'on teste à l'aide des chiffre 1, 2, 4 ou 8, qui est en fait un masque. Ce masque ne doit pas avoir d'autre valeur et c'est pour cela que je dois lever une exception.
    Mais il semblerait que je ne puisse pas récuperer correctement, dans mon main(), l'exception que j'ai lancé dans l'une des méthodes de ma classe case.

    Donc lorsque j'utilise mon exception est lancé en ajoutant le "&" dans le catch, le programme se ferme toujours. si je le lève j'ai toujours "Erreur: St9Exception", au lieu de "Erreur:Trops de directions passées en paramètre. Seulmes les valeurs 1, 2, 4 ou 8 sont autorisées".

    Je me heurte donc encore a ce problème d'exception qui ne se laisse pas bien attraper.
    Ancien membre du projet "Le Dernier Âge".

  9. #9
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Tu veux dire que si tu places ton exception au même niveau que le try/catch censé l'attraper, tout fonctionne bien ? Dans ce cas tente de trouver quel endroit met le boxon dans la remontée de ton exception (même si j'avoue que je ne vois pas trop ce qui pourrait altérer ce genre de chose) -> lève l'exception directement au niveau de ton try/catch, puis descend petit à petit dans les appels de fonction jusqu'à retomber à l'endroit où ton exception doit effectivement se trouver.

    Autre piste : si tu lèves un autre type d'exception (par exemple std::runtime_error, inclure <stdexcept>), même résultat ?

  10. #10
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 750
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    Il ne faut pas oublier le &, sinon tu vas être confronté au problème de slicing, c'est à dire que ta classe Laby_Exception va être tronquée en std::exception.

  11. #11
    Membre éclairé
    Avatar de Floréal
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 456
    Points : 849
    Points
    849
    Par défaut
    Alors en essayant de lancer recuperer l'exception directement dans maméthode, mon programe s'arrete, avec belle erreur avec choix d'envoyer ou non un rapport d'erreur.
    Si maintenant je lance mon excpetion dans le bloc de try ... catch directement avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    catch ( const std::exception & X )
    alors le programe s'arrete tout seul. Et toujours le même message "st9exception" si je la récupère au moyen de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    catch ( const std::exception X )
    peut être est-ce ma classe d'Exception qui est mal écerite?
    Ancien membre du projet "Le Dernier Âge".

  12. #12
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    peut être est-ce ma classe d'Exception qui est mal écerite?
    A priori non, mais c'est pour cela que je t'ai suggéré d'utiliser une classe bien écrite (std::runtime_error par exemple)

  13. #13
    Membre éclairé
    Avatar de Floréal
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 456
    Points : 849
    Points
    849
    Par défaut
    Même choise pour les deux cas, cit"s plus hauts si je lève une exception std::runtime_error
    Ancien membre du projet "Le Dernier Âge".

  14. #14
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Essaye d'écrire un exemple complet minimal qui reproduit le problème. Ca, ça marche à tous les coups.

  15. #15
    Membre éclairé
    Avatar de Floréal
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 456
    Points : 849
    Points
    849
    Par défaut
    Je vais essayer, je vous tiens au courrant
    Ancien membre du projet "Le Dernier Âge".

Discussions similaires

  1. Try Catch (?) sur une erreur d'accès mémoire
    Par Jflop91 dans le forum Langage
    Réponses: 1
    Dernier message: 26/03/2013, 15h36
  2. Eclaircissements sur le try / catch
    Par ZeGuizmo dans le forum Langage
    Réponses: 10
    Dernier message: 17/10/2009, 23h05
  3. Erreur, même dans un try-catch
    Par TheCool dans le forum C#
    Réponses: 3
    Dernier message: 06/03/2008, 19h26
  4. Réponses: 2
    Dernier message: 30/10/2007, 08h41
  5. Précision sur le try/catch
    Par Faiche dans le forum Langage
    Réponses: 2
    Dernier message: 13/07/2007, 21h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo