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
    Membre à l'essai
    Inscrit en
    Février 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 4
    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 Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    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.

  3. #3
    Membre Expert
    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
    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
    Par défaut
    Une division par zéro lève un comportement indéfini, pas une exception.

  5. #5
    Membre à l'essai
    Inscrit en
    Février 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 4
    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
    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
    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
    Membre à l'essai
    Inscrit en
    Février 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 4
    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