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 :

Question sur les exceptions


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Femme Profil pro
    Ingénieur informatique scientifique
    Inscrit en
    Mai 2010
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique scientifique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 313
    Par défaut Question sur les exceptions
    Bonjour,

    je suis actuellement en train de développer un petit programme en c++, langage dont je n'ai pas trop l'habitude et j'ai quelques interrogations concernant les exceptions. J'ai écrit ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    try
    {
        // Mon code ici
    }
    catch(exception e)
    {
        cerr << "Failure: " << e.what() << endl;
    }
    En fait je ne sais pas trop comment savoir le type d'exceptions pouvant être levées par mon code, alors je met un "exception" qui si j'ai bien compris va "catcher" tout type d'exception.
    Est-ce correct de faire de façon, et si non comment faire pour savoir quelle(s) exceptions gérer sans en oublier?
    Merci d'avance pour votre aide!

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    En C++, on peut lever n'importe quoi.
    std::exception est le type de base de toute exception levée par la bibliothèque standard.
    Par contre, tu peux parfaitement écrire throw 42;, throw false;, throw "pas de chance"; ou encore throw std::map<int, int>();.

    L'instruction qui permet d'attraper n'importe quoi est catch(...).
    Bien sûr, "n'importe quoi" n'a aucun type défini, donc tu ne peux rien faire du tout de l'objet levé.
    Tu ne pourras te servir que du fait qu'il a été levé.

    Second conseil. Pour éviter des copies d'exception (ce qui est vital dans le cas d'un std::bad_alloc), il est recommandé d'attraper les exceptions par référence constante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    try {
        //du code
    } catch (std::exception const& e) {
        arg_zut(e.what());
    } catch (...) {
        paf();
    }
    Pour savoir quelles exceptions attraper, il faut avoir une documentation, ou lire le code .
    C'est pour cela que des commentaires disant quelles exceptions sont levées sont utiles

  3. #3
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 770
    Par défaut
    Citation Envoyé par leternel Voir le message
    Pour savoir quelles exceptions attraper, il faut avoir une documentation, ou lire le code .
    C'est pour cela que des commentaires disant quelles exceptions sont levées sont utiles
    Il n'y a pas un truc en C++ du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void /*or ...*/ my_method(/* ... */) throw std::bad_alloc /*, ...*/;

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Plus maintenant.
    En C++11 et suivant, il n'existe que nothrow() et nothrow(compile-time condition).

  5. #5
    Membre éclairé
    Femme Profil pro
    Ingénieur informatique scientifique
    Inscrit en
    Mai 2010
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique scientifique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 313
    Par défaut
    C'est plus clair pour moi maintenant!
    Je n'avais pas pensé à la copie d'exception.
    Merci pour vos explications!

  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
    En plus, attraper une exception par valeur causerait du slicing (perte des données spécifiques à la classe dérivée).
    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 éclairé
    Avatar de EpiTouille
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 372
    Par défaut
    Salut

    Donc en fait si tu fais

    Tu ne vas pas catcher TOUTES les exceptions mais les exceptions qui héritent de std::exception. Il y a un moyen pour catcher toutes les exceptions c'est de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    try
    {
      // ton code;
    }
    catch (...)
    {
    }
    Les "..." veulent bien dire toutes les exceptions.

    Petite remarque en passant, quand tu fais

    Tu fais une copie de l'exception e. En génréral on préfère un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    catch (exception const& e)
    Bon courage et bonne journée

    EDIT: leternel tape plus vite que moi :'(

  8. #8
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    c'est l'entrainement

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

Discussions similaires

  1. Questions de base sur les exceptions
    Par Kaluza dans le forum Langage
    Réponses: 4
    Dernier message: 08/04/2012, 23h04
  2. Encore une question sur les exceptions
    Par tnarol dans le forum Général Java
    Réponses: 6
    Dernier message: 01/03/2011, 12h54
  3. Question sur les exceptions catch / non catch
    Par MrEddy dans le forum Général Java
    Réponses: 2
    Dernier message: 21/10/2010, 12h25
  4. Questions sur les exceptions et finally
    Par _LittleFlea_ dans le forum Général Java
    Réponses: 10
    Dernier message: 23/03/2010, 16h08
  5. question sur les message box !
    Par krown dans le forum Langage
    Réponses: 7
    Dernier message: 02/08/2002, 16h11

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