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()] ne capture rien


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Par défaut [try catch()] ne capture rien
    bonjour,

    je travaille avec gcc

    voila si j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    try {
         throw ;
    } catch (...) {
         cout << "catch error" << endl;
    }
    ca plante mon programme et donc ça ne passe pas dans le catch

    si j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    try {
          throw 1;
    } catch (...) {
          cout << "catch throw 1" << endl;
    }
    j'aimerais savoir comment capturer les exception dans le premier cas
    merci

  2. #2
    Membre chevronné
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Par défaut
    salut !

    throw sans argument est une syntaxe spéciale qui redirige une exception au niveau supérieur. Exemple:

    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
     
    try {  // Try niveau 1
         fonction ();
         try {   // Try niveau 2
              while (yes)
              {
                     if (something())
                            throw mon_exception();
              }
         }
         catch (...)  // catch niveau 2
         {
             if (peut_faire_qqchose() == false)
             {
                  std::cout << "Oh heu ... Une exception a été générée, mais je sais pas quoi en faire en fait. Je vais juste la rebalancer au niveau supérieur\n";
                 throw;
         }
    }
    catch (std::exception& ex) // catch niveau 1
    {
          std::cout << "Ah ici je sais quoi faire de cette exception. Je vais m'en occuper\n";
    }
    Si tu ne pouvais pas faire ça, alors ça voudrait dire que le catch niveau 2 devrait regénérer exactement la même exception, ce qui n'est pas forcément évident.

    Dans ton cas, ton bloc try essaye de rebalancer une exception au niveau supérieur, mais il n'y en a aucune en cours, donc ça plante.
    Qu'est-ce que tu essayes de faire ?

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Par défaut
    ben en fait c'est pour capturer des exceptions du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    string s = "toto";
    printf("%s", s);
    mais plus généralement pour capturer des exceptions du system
    (le printf est juste a titre d'exemple, je sais très bien que ça va planter lol, mais j'aimerais capturer l'exception)

  4. #4
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Comme la dit phi1981 ton premier code actuel est invalide.

    throw; sert à relancer une exception, ça implique qu'une exception doit être en cours de traitement, dit autrement ce morceau de code doit se trouver dans un bloc catch. Dans le cas contraire std::terminate est appelé (si c'est le comportement de std::terminate que tu veux changer, alors cherche du côté de std::set_terminate).

    Donc pour faire simple, tu ne dois jamais écrire ton premier code.

    Si ta question concerne particulièrement les exceptions systèmes, dans ce cas tu ne trouveras rien dans le C++ standard, puisque les exceptions systèmes vont dépendre du système. Il faudra donc dans tout les cas passer par une bibliothèque externe, pour windows je suppose que c'est dans la MSDN, pour linux ce doit être un en-tête à inclure que tu devrais trouver avec les mots clés "signal handling".

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 449
    Par défaut
    Pour Windows :

    Même s'il est possible de "catcher" tout et n'importe quoi, il ne faut JAMAIS le faire.

    On ne catch que ce que l'on sait traiter (loger n'est pas traiter).

    Si vous voulez avoir des informations en cas de crash, utilisez les utilitaires de génération automatique de dump comme Dr. Watson ou ADPlus.

    Avec ces dumps et les fichiers PDB générés pendant la compilation, vous pouvez avoir une vue exacte du programme et de ça mémoire au moment exacte du crash.

    Si vous voulez réduire l'interruption de service du programme planté, faites en un service Windows ou utilisez un simple Watch Dog pour relancer automatiquement le programme.

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    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 392
    Par défaut
    Citation Envoyé par bacelar Voir le message
    On ne catch que ce que l'on sait traiter (loger n'est pas traiter).
    Note: Je ne vois pas d'inconvénient à catcher pour loguer ce qu'on ne peut pas traiter du moment qu'on relance ensuite.
    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.

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

Discussions similaires

  1. try.. catch. try catch plus rien.
    Par gnt.dev dans le forum Langage
    Réponses: 4
    Dernier message: 03/02/2012, 09h55
  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