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

Langage C++ Discussion :

try/catch vs __try/__except


Sujet :

Langage C++

  1. #1
    DR
    DR est déconnecté
    Nouveau membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mai 2002
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2002
    Messages : 28
    Points : 30
    Points
    30
    Par défaut try/catch vs __try/__except
    Bonjour à tous,

    Depuis 12 ans que je fais du C++ Builder (5 en l'occurence), je pensais tout savoir (ou presque) sur le try/catch, mais là je dois maintenir du code qui ne m'appartient pas et j'en perd un peu mon latin.

    Il s'agit d'un exécutable C++ sans la VCL, et c'est là que tout se complique. Je l'ai reproduit en faisant une application console (nouveau projet/expert console/décocher VCL) et ça donne le code suivant :
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    #pragma hdrstop
    #include <exception>
    #include <excpt.h>
    #pragma argsused
     
    int main(int argc, char* argv[])
    {
      __try
      {
        try
        {
          int i = 0;
          int j = 1;
          int k = j / i;     //ici on va planter car on divise par 0
          return k;
        }
        catch (std::exception &e)
        {
          return 1;
        }
        catch (...)
        {
          return 2;
        }
        return 0;
      }
      __except(EXCEPTION_EXECUTE_HANDLER)
      {
        return 3;
      }
    }
    Je m'attendais à ce que le programme retourne 1, 2 à la rigueur. Et bien non, il retourne 3 à tous les coups. En revanche, si on rajoute la VCL, tout fonctionne comme je m'y attendais, mais ce n'est pas possible dans le cas de mon vrai projet.

    Quelle en est la raison ? La doc sur le __try/__except n'est pas très verbeuse, internet non plus. Est-ce un problème du langage ? du compilateur ? ou est-ce normal ?

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    __try/__except est une extension de Visual. Seul try/catch/throw font partis de la norme C++. La division par zéro ne génère pas une exception au sens C++ mais ce que Win32 appelle une 'structured exception' ce qui est différent. C'est un mécanisme spécifique windows.
    Plus d'info : http://cpp.developpez.com/cours/
    Ainsi que le MSDN.

  3. #3
    DR
    DR est déconnecté
    Nouveau membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mai 2002
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2002
    Messages : 28
    Points : 30
    Points
    30
    Par défaut
    Merci pour ta réponse, je me coucherai moins bête ce soir.

    C'est quand même bien la VCL de Borland ! Tout est ré-encapsulé dans des exceptions (EZeroDivide, EAccessViolation...), ce qui évite d'avoir cette double gestion try/catch et __try/__except.

  4. #4
    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 573
    Points
    41 573
    Par défaut
    Ça existe aussi sous Visual.

    Aussi, regarde du côté des options du switch /EH??, je crois qu'il change aussi le comportement du catch(...).

    PS: C'est bizarre, il me semblait qu'on n'avait pas le droit de mettre du SEH et des catch dans la même fonction...

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

Discussions similaires

  1. Builder n'accepte pas try/catch/__finally
    Par Rodrigue dans le forum C++Builder
    Réponses: 3
    Dernier message: 18/04/2005, 13h15
  2. __try __finally et try catch
    Par buzzz dans le forum C++
    Réponses: 6
    Dernier message: 19/02/2005, 15h31
  3. [debutant sous eclipse] surround with try catch
    Par Alwin dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 26/06/2004, 20h03
  4. [try-catch] relancer les instruction du bloc try
    Par nounou dans le forum Langage
    Réponses: 11
    Dernier message: 12/05/2004, 11h23
  5. Exception & Try..catch
    Par PurL dans le forum C++Builder
    Réponses: 2
    Dernier message: 11/12/2002, 15h35

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