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 :

Exception dans le constructeur


Sujet :

C++

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 577
    Points : 256
    Points
    256
    Par défaut Exception dans le constructeur
    Bonjour,

    j'ai beaucoup de mal à comprendre l'interet de lever une exception dans un constructeur comme c'est expliqué dans la faq.
    En effet, le fait de lever une exception va terminer le programme, non ?
    Par exemple, supposons un un truc du style dans un constructeur où on désire ouvrir un fichier pour lire son contenu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	try
    	{
    		if(fopen("un fichier qui n'existe pas", "rb")
    			throw std::string( "fichier inexistant" );
    	}
    	catch ( const std::string & Msg )
    	{
    		std::cerr << Msg;
    		throw;
    	}
    Bon si je mets pas le throw dans le catch, je ne termine pas mon programme certes, mais qu'est ce que je fais de mon objet ?

    Et les exceptions dans un process 7/7 24/24 ? On ne va quand même pas l'arreter ? A mon avis (tant que je comprends pas plus ce mécanisme) il vaut mieux "tester avec des if" pour ne pas risquer l'interruption du prog, non ?

    Merci de m'éclairer la-dessus.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Points : 1 745
    Points
    1 745
    Par défaut
    Si tu entoure ton constructeur de try...catch
    Le programme ne s'arrêtera pas
    Et tu pourra même réaliser des actions pour traiter les erreurs.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 577
    Points : 256
    Points
    256
    Par défaut
    merci pour ta réponse.
    Mais alors ça revient au même que de tester si le constructeur a marché non ?
    Voir mon récent post : http://www.developpez.net/forums/sho....php?t=339081&
    où Laurent Gomilia m'a suggéré de redéfinir les opérateur ! et de conversion vers bool.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Points : 1 745
    Points
    1 745
    Par défaut
    Oui ça revient a peut près à la même chose...

    Edit : en me relisant, je ne sais pas si je me suis bien fait comprendre quand j'ai dit que le programme ne s'arrêterai pas, je parlais du programme global, dans ton constructeur tout le code qui se trouvera après le throw sera zappé.

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 577
    Points : 256
    Points
    256
    Par défaut
    Citation Envoyé par mad-math
    Edit : en me relisant, je ne sais pas si je me suis bien fait comprendre quand j'ai dit que le programme ne s'arrêterai pas, je parlais du programme global, dans ton constructeur tout le code qui se trouvera après le throw sera zappé.
    Oui oui j'avais bien compris

  6. #6
    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
    Points : 4 625
    Points
    4 625
    Par défaut
    En effet, le fait de lever une exception va terminer le programme, non ?
    T'as pas trop du comprendre le chapitre sur les exceptions de ton livre toi...

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 577
    Points : 256
    Points
    256
    Par défaut
    Citation:
    En effet, le fait de lever une exception va terminer le programme, non ?

    T'as pas trop du comprendre le chapitre sur les exceptions de ton livre toi...
    salut, merci pour la remarque !

    Mais c'est exact que, venant du langage C, j'ai du mal à ma familiariser avec ce mécanisme, ainsi que son utilité dans certains cas de figure.

    Effectivement, cela ne va pas forcément terminer le programme, mais je reviens à mon interrogation :
    quelle est la meilleure manière entre faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
       try
    	{
    	 CWaveFile wf("chanson.wav");
    	}
    	catch ( const std::string & Msg )
    	{
    		std::cerr << Msg;
    		throw;
    	}
    Ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    	CWaveFile wf("chanson.wav");
    	if(!wf)
                   std::cerr << Msg;
                 else
                    ...
    ???

    J'avoue, à mon stade, trouver la 1ère méthode + contraignante.
    Si qqun veut bien m'expliquer la meilleure méthode à utiliser ?

    @+

  8. #8
    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
    Points : 4 625
    Points
    4 625
    Par défaut
    L'intérêt des exceptions, c'est que tu n'es pas obligé de les attraper dans le contexte où elles ont été soulevées.
    En particulier, si tu n'as rien de mieux à faire qu'afficher un message d'erreur, autant de rien faire et déléguer cette tâche au gestionnaire global.

  9. #9
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Surtout que le message d'erreur, tu ne le verras pas.
    Alors que lorque tu attrapes une exception, l'IDE te situe immédiatement l'endroit où elle a été attrapée! -> gain de temps je trouve !

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 577
    Points : 256
    Points
    256
    Par défaut
    L'intérêt des exceptions, c'est que tu n'es pas obligé de les attraper dans le contexte où elles ont été soulevées.
    OK, ça, ça commence à rentrer !

    Bon, comme par la théorie, j'ai du mal, je vais me faire des exemples pour mieux comprendre leur interet.

    Merci à vous !

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 14/05/2008, 20h08
  2. Exceptions dans le constructeur
    Par disturbedID dans le forum C++
    Réponses: 20
    Dernier message: 14/02/2008, 13h42
  3. Réponses: 18
    Dernier message: 28/02/2007, 10h23
  4. exception dans un constructeur
    Par xxiemeciel dans le forum C++
    Réponses: 25
    Dernier message: 23/11/2005, 18h14
  5. Capture d'exception dans un constructeur
    Par declencher dans le forum Composants VCL
    Réponses: 8
    Dernier message: 03/02/2004, 12h52

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