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 :

__try __finally et try catch


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 70
    Points : 40
    Points
    40
    Par défaut __try __finally et try catch
    je bosse avec c++builder et je vois que ces deux systemes sont
    possibles, je comprends mal la difference

    J'ai vu pas mal d'exemples sur les threads qui utilisent toujours
    __try __finally
    normalement c'est equivalent a un try catch(...)

    et une derniere question
    comment recupere t on l'exception (eventuellement pour la relancer) avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    catch(...)
    {
      do...
      throw ??
    }

  2. #2
    Rédacteur
    Avatar de dvsoft
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2002
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2002
    Messages : 176
    Points : 622
    Points
    622
    Par défaut
    bonjour

    Aller un petit effort.
    saisie __finaly et tape sur F1 pour avoir de l'aide

    Rubrique:Blocs de terminaison

    Alain

  3. #3
    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 : 49
    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
    __finally n'est pas du C++, mais une truc spécifique à un compilo.

    Pour relancer une exception dans un bloc catch, il suffit de faire throw; dedans.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 70
    Points : 40
    Points
    40
    Par défaut
    resultat de F1 :

    Syntaxe

    __finally {instruction-composée}

    Description

    Le mot clé __finally spécifie les actions qui doivent être entreprises quel que soit l'existence du flux dans le __try précédent.
    il me semble comprendre qu'il y a une difference fondamentale etant donné que finally est toujours executé contrairement au bloc catch

    Pour relancer une exception dans un bloc catch, il suffit de faire throw; dedans
    ok merci

    voila mon probleme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    A * new A();
    __try
    {
      A->toto();
    }
    __finally
    {
      delete A;
    }
    donc ici la gestion du delete est simplifié, parfait
    cependant avec un couple try/catch je ne vois pas trop
    comment faire a part dupliquer le code dans un catch
    et apres le catch :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     try
    {
      A->toto();
    }
    catch(...)
    {
      delete A;
    }
    delete A;

  5. #5
    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 : 49
    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
    La réponse est RAII (tiens, je n'ai rien vu dans la FAQ à ce sujet...) :

    A chaque fois qu'une gestion de ressource (mémoire, mutex,...) fait appel à deux fonction, l'une pour l'acquérir (par exemple new), l'autre pour la libérer (par exemple delete), il ne faut pas écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int f()
    {
      maRessource.acquiert();
      // On fait des choses
      maRessource.libere();
    }
    Car si pendant les "choses", une exception est lancée, un return est appelé... la ressource ne sera jamais libérée.

    La solution est alors de créer une classe ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct RessourceHolder
    {
      RessourceHolder(Ressource &r) : ressourceHeld(r)
      {
        ressourceHeld.acquiert();
      }
      ~RessourceHolder() {ressourceHeld.libere();}
      Ressource &ressourceHeld;
    };
    Et de réécrire le code ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int f()
    {
      RessourceHolder(maRessource);
      // On fait des choses
      // Et le compilateur fait le boulot de libération à notre place.
    }
    Une classe de type RessourceHolder pour des pointeurs existe déjà, et est en standard de fait. Regarde boost::scoped_ptr sur www.boost.org.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 70
    Points : 40
    Points
    40
    Par défaut
    oui ok merci

    on m'a deje vendu de la RAII sur un autre post different
    effectivement cela supprime les problemes

    sinon ? depuis quand parle t on de cette RAII
    et y a t il un bouquin qui discute ce genre de chose
    (meme en anglais) histoire d'etre up to date

  7. #7
    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 : 49
    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
    Exceptional C++ de Sutter, mais comme c'est tiré des Guru of the Week, tu dois pouvoir en lire une bonne partie sur http://www.gotw.ca/gotw/index.htm

Discussions similaires

  1. try/catch vs __try/__except
    Par DR dans le forum Langage
    Réponses: 3
    Dernier message: 13/08/2010, 11h38
  2. Builder n'accepte pas try/catch/__finally
    Par Rodrigue dans le forum C++Builder
    Réponses: 3
    Dernier message: 18/04/2005, 13h15
  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