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

Visual C++ Discussion :

[eVC] Gestion d'exception incompréhensible


Sujet :

Visual C++

  1. #1
    Membre actif

    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    286
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 286
    Points : 255
    Points
    255
    Par défaut [eVC] Gestion d'exception incompréhensible
    Bonjour,

    J'utilise embedded Visual C++.

    Je souhaite gérer les exceptions dans le OnInitDialog de mon programme Dialog MFC.

    Voila le code que j'utilise :

    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
    try
    {
    	int erer=1;
    	erer--;
    	int azae = 5/ erer;
    	truc = _T("coucou !\n");
    	AjouterTexteTrace(truc);
    }
    catch( CException* theException )
    {
    	truc = _T("Exception !\n");
    	AjouterTexteTrace(truc);
    	/*TCHAR   szCause[255];
     
    	theException->GetErrorMessage(szCause, 255);
     
    	AjouterTexteTrace(CString(szCause));
    	theException->Delete();*/
    }
    AjouterTexteTrace() est une fonction qui ecrit dans un fichier texte -> elle fonctionne
    truc est un CString

    Je déclenche une exception pour tester le gestionnaire d'exception .. et c'est la ou je ne comprends rien ... ca ne fonctionne pas, l'exception n'est pas traitée, la forme se lance, ca part a moitié en sucette .. bref le bordel

    Je souhaite avoir un gestionnaire d'exception pour toutes les exceptions, et connaitre le problème rencontré.

    Le seul moyen que j'ai trouvé serait de mettre un :
    Mais dans ce cas je n'ai aucun moyen de connaitre l'exception qui s'est produite !

    Je suis paumé ...

    merci

  2. #2
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Points : 631
    Points
    631
    Par défaut
    Tout dépend de l'exception utilisée bien sur, mais généralement, il y a un champ de la classe qui contient une string qui est bien souvent le message d'erreur à faire apparaitre.

    Donc la raison pour laquelle tu n'attrapes pas l'exception est que tu ne dois pas avoir le bon type dans ton catch, donc avec le catch(...) il serait possible de déterminer sa cause en cherchant un peu

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 575
    Points
    41 575
    Par défaut
    On peut voir comment tu la lances, l'exception ?

  4. #4
    Membre actif

    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    286
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 286
    Points : 255
    Points
    255
    Par défaut
    Faiche, j'avoue que je ne vois pas trop ou tu veux en venir

    Medinoc : c'est dans le code : division par 0

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	int erer=1;
    	erer--;
    	int azae = 5/ erer;

  5. #5
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Points : 631
    Points
    631
    Par défaut
    Ah j'avais pas vu que tu lançais une division par 0 !

    Alors la division par 0 n'est pas du tout du type CException, ce qui explique pourquoi tu ne l'attrapes pas.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 575
    Points
    41 575
    Par défaut
    Et si j'en crois ce diagramme, la division par 0 n'est même pas une exception C++.
    Sous un Visual C++ récent, elle ne devrait même pas être récupérée par le catch(...) : Sous Win32, il faut du Structured Exception Handling, pour intercepter les exceptions EXCEPTION_FLT_DIVIDE_BY_ZERO et EXCEPTION_INT_DIVIDE_BY_ZERO...

    Tu peux peut-être l'intercepter avec signal(), aussi...

  7. #7
    Membre actif

    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    286
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 286
    Points : 255
    Points
    255
    Par défaut
    ah ...

    Tout ca ne me parait pas bien clair ..

    Je connais les SEHs, il me semblait que try/catch en faisait partit ...

    Donc d'après vous, mon code devrait pouvoir intercepter les exceptions (outre certaines comme la division par 0) ?

    Pour vous situer mon problème, j'utilise un SDK. Je fais appel a une fonction de ce SDK -> ca part en vrille, j'ai semble t'il une exception.
    Moi ce que je voudrais simplement, c'est traiter l'exception afin de connaitre l'erreur.
    Comment faire ?

    La je suis 100 pieds sous terre ...

    PS : il me semblait aussi que CException traitait toutes les exceptions ... non ?

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 575
    Points
    41 575
    Par défaut
    • try/catch() : C++ exception handling. Traite les exceptions C++.
      • Comme exceptions, la STL lance toujours des objets d'une classe dérivée de std::exception,
      • MFC lance toujours des objets d'une classe dérivée de CException.
    • __try/__except() : Structured Exception Handling (SEH). Traite les exceptions Win32.

  9. #9
    Membre actif

    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    286
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 286
    Points : 255
    Points
    255
    Par défaut
    Mais dans quel cas utiliser l'un ou l'autre ?
    Y'en a t'il un meilleur que les autres ?
    Je n'arrive toujours pas a bien comprendre comment tout ca fonctionne ... sachant qu'il existe aussi les TRY/CATCH/ENDTRY

    De + la MSDN dit :
    Structured exception handling works with Win32 for both C and C++ source files. However, it is not specifically designed for C++. You can ensure that your code is more portable by using C++ exception handling. Also, C++ exception handling is more flexible, in that it can handle exceptions of any type. For C++ programs, it is recommended that you use the C++ exception-handling mechanism (try, catch, and throw statements).
    patapé

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 575
    Points
    41 575
    Par défaut
    Les exceptions C++ sont celles à utiliser, mais si quelque chose lance une exception Win32 (genre, une Access Violation), seul le SEH peut les intercepter.

  11. #11
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Il me semblait qu'il y avait une passerelle entre les deux types d'exceptions, sous visual C++. peut-être un flag de compil ?

    A part ça, si un catch(...) semble trop générique, ne pas oublier qu'on peut avoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    try{}
    catch(std::exception &e) {}
    catch(CException &e){}
    catch(...) {}

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 575
    Points
    41 575
    Par défaut
    Sous les anciens Visual (ancien= je ne sais pas mais je dirais pré-2005), catch(...) capture aussi les exceptions Win32. Mais c'était considéré un bug, "corrigé" sous 2005.

    De plus, on ne peut pas utiliser le try/catch() C++ et le SEH dans la même fonction (mais j'ignore si on peut pour une fonction qui en appelle une autre).

  13. #13
    Membre actif

    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    286
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 286
    Points : 255
    Points
    255
    Par défaut
    Ouais ... , j'comprends mieux pourquoi j'comprends rien ^^
    Mais j'comprends quand meme un peu mieux maintenant
    Merci pour les infos.

    Faut croire que je sois le seul a me prendre la tete sur ce genre de pb a la con

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