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 :

gestion d'exception inconnue


Sujet :

C++

  1. #1
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut gestion d'exception inconnue
    Bonjour à tous,

    j'utilise une dll (dont je n'ai pas les sources) qui plante lors de l'appel d'une fonction (fonction Init() en l'occurence, c'est plutot gênant). Le problème, c'est que je ne sais pas de quel type d'exception il s'agit.

    Mon code ressemble à ça, pour l'instant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    try
    {
        InstanceDeMaDll.Init([mes paramètres]);
    }
    catch (...)
    {
        //affiche message d'erreur
        //desalloue ce qu'il faut
        return false;
    }
    Or, je voudrais savoir d'où vient l'erreur. Il faudrait donc que je puisse connaitre la nature de l'exception et, avec un peu de chance, j'aurais des informations sur l'erreur.

    Savez-vous comment dois-je m'y prendre?

    Merci.

    P.S: les personnes qui ont codé cette dll sont en vacances et je n'ai pas les sources. Et bien évidemment, il n'y a aucune doc ni aucun commentaire dans les .h
    P.S.2: cette fonction (Init) fonctionne quand je l'utilise seule pour la tester, mais pas quand je l'intègre dans le gros projet sur lequel je travaille.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Déjà, le "plantage", c'est quoi ?
    Si c'est une exception C++ (genre bad_alloc, throw...), ton try...catch la captera.
    Si c'est une exception système (genre Access Violation, RaiseException()), il faut du Structured Exception Handling pour la capturer (catch(...) n'est pas supposé les capter, même s'il le fait sous Visual < 2005).

    En SEH, tu peux connaitre la nature de l'exception avec GetExceptionCode() et GetExceptionInformation(), sinon pour les exceptions C++, je ne sais pas. Si c'est un objet héritant de std::exception, la RTTI peut peut-être t'aider si elle était activée lors de la compilation de la DLL...

    Note: Si la DLL utilise la nouvelle C Run-Time Library, une Access Violation peut avoir été en réalité déclenchée par le "Invalid parameter handler" : Voir dans la doc des fonctions C (genre : sprintf_s()) pour savoir comment intercepter cela.
    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.

  3. #3
    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
    Est-ce que déjà tu es sûr qu'il s'agit d'une exception ?

    Tu peux attraper un std::exception, avec un peu de chance l'exception levée en dérive et fournit un what() explicite.

    Tu peux aussi en regardant les en-têtes voir quels types d'exceptions ont été créés dans ta bibliothèque, et tenter de tous les rattraper.

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Lance-le à partir de la ligne de commande et regarde s'il y a un affichage lors de l'exception - sinon std::exception a un membre what qui retourne un char* -

  5. #5
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    wow, merci pour vos réponses

    Alors:
    1/ Je ne suis pas certain qu'il s'agisse d'une exception (la gestion des exceptions est une de mes nombreuses lacunes). Mais étant donné que le catch(...) récupère l'erreur et que le code qui suit le catch est exécuté, je pensais qu'il s'agissait bien d'une exception. C'est pas ça?

    2/ J'ai tenté la std::exception:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    try
    {
        MaDll.Init(...);
    }
    catch(std::exception)
    {
    ...
    }
    mais là, il ne passe pas dans le catch

    >> Miles: je suis sous visual2005, et le projet sur lequel je bosse est trop énorme. Pour être précis, c'est un service windows, et je ne vois pas comment l'exécuter à partir de la ligne de commande.

    >> Laurent Gomilla: quand tu parles des en-têtes, tu veux dire les fichiers .h ? Si c'est le cas, il n'est question d'aucune exception dans les .h

    >> Médinoc: qu'est-ce que SEH? Apparemment, c'est en rapport avec windows CE. J'ai cependant tenté d'uitilser GetExceptionCode() et GetExceptionInformation() mais je reçois l'erreur de compil suivante: error C2707: '_exception_code' : bad context for intrinsic function

    encore à vous

  6. #6
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Déjà, si tu catches qqch, c'est sous une autre forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    try
    {
    }
    catch(const std::exception& except)
    {
    /// Affiche except.what()
    }
    Si tu passes par valeur, tu perds l'héritage, donc la spécificité de l'exception et en plus tu la recopies.

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Le SEH (Structured Exception Handling) marche sous toutes les versions de Windows, et fonctionne également en C.

    On s'en sert avec les mots-clés __try et __except().
    Note : Comme indiqué dans la doc, GetExceptionCode() etc. ne marchent que dans le contexte du SEH : Dans l'expression entre parenthèses du __except et dans le bloc d'instructions qui le suit.

    Et essaie aussi un catch sur les string /char * / etc. : ça n'hérite pas d'exception, mais c'est lançable aussi...
    Utilise aussi des exception *, car on peut aussi lancer une exception avec new...
    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
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Alors, j'ai tenté ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    try
    {
    }
    catch(const std::exception& except)
    {
    /// Affiche except.what()
    }
    mais l'exécution ne passe pas dans le catch.

    Sinon, je viens de capter un truc: je suis en C++/CLI (hum, je devrais peut-être déplacer mon post du coup ?).
    Du coup, j'ai tenté ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    try
    {
    }
    catch(Exception^ e)
    {
    ...
    }
    Et ça fonctionne. Le message obtenu ainsi est: "Attempted to read or write protected memory. This is often an indication that other memory is corrupt." En fait c'est une simple "segmentation fault" vous pensez?

    Ce que je ne comprend vraiment pas, c'est pourquoi cette satané dll fonctionne dans une appli toute simple, et dans mon projet, elle ne veut rien savoir

  9. #9
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Problème de spécification, dis à tes collègues de mettre les préconditions et les postconditions nécessaires dans la doc afin de pouvoir s'en servir correctement

  10. #10
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Arf, c'est bien ce que je craignais... il va falloir que j'attende qu'ils rentrent de vacances

    Bon ben tant pis, j'ai un diagramme UML à faire moi, une histoire de carte en 2D isométrique etc ...

    Encore à tous. Je met résolu.

  11. #11
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Un message de ce type, c'est typiquement une AccessViolationException : une segfault, en effet.

    Si tu n'as aucune doc, pas moyen de savoir ce qui a causé cette erreur...
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [ORACLE 9i] Gestion des exceptions
    Par sygale dans le forum SQL
    Réponses: 6
    Dernier message: 19/08/2004, 15h06
  2. Gestion des exception (EOleException)
    Par shurized dans le forum Bases de données
    Réponses: 5
    Dernier message: 30/06/2004, 17h25
  3. [C#] Gestion d'exception
    Par ALCINA dans le forum Windows Forms
    Réponses: 4
    Dernier message: 18/05/2004, 12h18
  4. [XMLRAD] gestion des exceptions
    Par pram dans le forum XMLRAD
    Réponses: 2
    Dernier message: 28/01/2003, 17h48
  5. c: gestion des exceptions
    Par vince_lille dans le forum C
    Réponses: 7
    Dernier message: 05/06/2002, 14h11

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