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 :

Type d'exception inconnu


Sujet :

C++

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut Type d'exception inconnu
    Bonjour,

    J'ai une exception que je n'arrive à choper qu'avec catch(...).

    Le code suivant n'est-il pas de même supposé attraper toutes les exceptions ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    catch (const std::exception &e)
    {
        cerr << e.what();
    }
    Sinon, quel est le moyen pour connaître le type d'une exception ?

    Merci.

  2. #2
    Membre Expert
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Par défaut
    Le code suivant n'est-il pas de même supposé attraper toutes les exceptions ?
    Malheureusement, en C++, il est possible de lever des exceptions... qui n'en sont pas ! En effet :
    est un code valide. Et le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    catch(std::exception& e)
    ne permet pas de récupérer cette levée. A priori, n'importe quel objet C++ (au sens du langage) peut être utilisé dans une expression throw. Il faut te documenter sur les objets utilisés. En particulier, sous Windows/MFC, les CException sont utilisées et ne sont pas des exceptions standards. Pire, ce sont des pointeurs vers des exceptions qui sont "jetés".

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    En fait, l'exception est "jetée" par l'instruction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    throw AmException( MString("Unable to find RenderGlobals"), __FILE__, __LINE__);
    sachant que AmException est définie par :

    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
    #include <exception>
    #include <maya/MString.h>
     
    class AmException : public std::exception
    {
    public:
        AmException(MString msg, const char *file = NULL, int line = -1);
        virtual const char *what(void) const;
     
    private:
        MString mMessage;
        MString mFile;
        int mLine;
    };
    #endif /* _EXCEPTION_H_ */
    Je précise qu'aucun destructeur n'a (encore) été codé.

  4. #4
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Ton code est censé rattraper tout ce qui dérive de std::exception, ce qui est le cas de AmException, donc il doit y avoir une erreur autre part. Tu peux essayer d'extraire un code minimal qui reproduit le problème, ça ne devrait pas être très dur vu le contexte restreint.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Il y avait en fait une autre exception qui venait s'intercaler, et qui a troublé le raisonnement.

    Cela dit, si j'arrive bien à présent à attraper la classe xxception, je n'arrive pas à attraper AmException... :-/

    Au fait, c'est bizarre, Visual 2003 ne reconnaît pas par Intellisense ("autocompletion") std::exception, alors qu'il n'y a aucun problème pour std::bad_alloc.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Bon, rien à faire, je n'arrive pas à attraper mon instance AmException.

    Je remets quelques morceaux de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    throw AmException( MString("Unable to find RenderGlobals"),
                                         __FILE__, __LINE__);
    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
    catch (int)
    {
    	AmLogger::write(AM_MESG, "Dudule");
    }
     
    catch (AmException &amException)
    {
        AmLogger::write(AM_MESG, "amException");
        AmLogger::write(AM_MESG, amException.what());
    }
     
    catch (const std::exception &e)
    {
    	AmLogger::write(AM_MESG, e.what());
    }
    Si je balance un entier ou une instance d'exception (je parle de la classe), pas de problème. Mais avec AmException, que dalle...

    Merci pour votre aide, car je susi à la ramasse, là.

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 394
    Par défaut
    As-tu essayé avec const ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Idem !

    Merci néanmoins pour la suggestion.

  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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Ton code sorti de son contexte est supposé fonctionner ; c'est donc le contexte qui introduit une erreur quelque part (quelque chose qui ne se trouve pas dans ce que tu nous montres).
    Donc comme je te l'ai dit, le meilleur moyen est d'extraire un code complet minimal qui reproduit le problème ; là tu trouveras tout de suite l'origine du problème.

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    En fait, il semble que le fait de lever cette exception en levait une autre qui venait s'intercaler...

Discussions similaires

  1. type Rapport d'exception : inconnu ?
    Par shawty dans le forum Struts 1
    Réponses: 6
    Dernier message: 18/04/2007, 09h54
  2. [D7] connaître un type d'exception et la gérer
    Par _alex_ dans le forum Delphi
    Réponses: 3
    Dernier message: 29/08/2006, 13h41
  3. gestion d'exception inconnue
    Par r0d dans le forum C++
    Réponses: 10
    Dernier message: 17/08/2006, 21h20
  4. Problème avec une erreur d'exception inconnue
    Par yoyo72 dans le forum Delphi
    Réponses: 5
    Dernier message: 09/08/2006, 11h52
  5. [STRUTS] Intercepter tout type d'exception.
    Par Hervé Saladin dans le forum Struts 1
    Réponses: 4
    Dernier message: 24/06/2005, 17h12

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