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 :

Exceptions non "catchables"


Sujet :

C++

  1. #1
    Candidat au Club
    Inscrit en
    Février 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Exceptions non "catchables"
    bonjour,

    J'ai un programme en C++ avec un appel RPC qui génère une exception. J'ai entourée cette ligne par un try catch(...) mais je n'arrive pas à catcher l'exceptions. A la place j'ai une fenêtre windows avec un rapport d'erreur qui s'affiche.

    J'ai essayé de rajouter avant l'appel une ligne qui fait une division par zero, et la mm probleme, l'exception de division par 0 n'est pas catchée.

    Enfin j'ai essayé de lever moi même une exception avec un throw et cette fois-ci miracle l'exception est catchée.

    Je ne comprends pas bien comment fonctionne le mécanisme d'exception en C++ mais de ce que j'en sais, le catch(..) aurait du catcher toutes les exceptions. Est-ce que quelqu'un aurait une idée sur la raison de ce comportement? Peut-être faut-il rajouter handler spécial pour gérer ces exceptions?

    Merci d'avance pour votre aide

  2. #2
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Les exeptions du type déclenché ne sont peut être par géré (par une mauvaise conception, ou un oublie). Décortique le code qui pose problème dans la bibliothèque pour voir.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  3. #3
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Il y a une option de compilation à mettre pour que, sous visual, les divisions par 0 et autres soient traitées en tant qu'exceptions.

    Par défaut, leur comportement est plutôt celui d'un abort().

    À noter que dans tous les cas, ça ne sera pas portable, et que tu ne dois pas faire une division par zéro (et donc, essayer de la récupérer est une mauvaise idée, sauf si évidemment des vies sont en jeu ).

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Une division par zéro lève un comportement indéfini, pas une exception.
    Boost ftw

  5. #5
    Candidat au Club
    Inscrit en
    Février 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Merci pour vos réponses. Le division par zero me servait juste à tester si le problème venait de la gestion des exceptions. Je vais regarder pour l'option de compilation.

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Sous Windows, les divisions par zéro et les appels RPC déclenchent chacun une exception Win32.

    J'ignore comment ça se gère sous MinGW, mais sous Visual, il faut utiliser des blocs __try/__except, par opposition aux blocks try/catch.
    Notez qu'on ne peut utiliser les deux dans une même fonction.
    Sinon, il y a aussi l'option d'utiliser _set_se_translator().

    PS: Pour une gestion correcte, vérifier que le paramètre "C++ Exception Handling" du projet est /EHa et non pas /EHsc.
    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.

  7. #7
    Candidat au Club
    Inscrit en
    Février 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    En utilisant l'option de compilation /EHa à la place de /EHsc je catche toutes les exceptions. cela semble résoudre le problème et me permet de gérer tous les cas dégradés. Merci pour tout.

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

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