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 PHP Discussion :

[POO] Utilisation des exceptions [PHP 5.2]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Huntress
    Femme Profil pro
    Inscrit en
    Août 2004
    Messages
    475
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 475
    Par défaut [POO] Utilisation des exceptions
    Bonsoir,

    Je me pose des questions sur l'utilisation des exceptions, j'aimerais bien ne pas les détourner... car "c'est le mal"... donc voici un petit exemple pour illustrer ma question :

    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
    <?php
     
    class Chat {
     
    	private $nom;
     
    	public function __construct($nom = '') {
     
    		try {
    			if(strlen(trim($nom)) != 0)
    				$this->nom = $nom;
    			else
    				throw new Exception('Vous devez donner un nom au chat !');
    		}
    		catch(Exception $e) {
    			echo $e->getMessage();
    		}
    	}
     
    	public function miaou() {
     
    		echo 'miaou';
    	}
    }
     
    $monChat = new Chat();
    echo '<hr />';
    $monChat->miaou();
     
    ?>

    Lors de l'exécution de ce code, une exception est levée, car je n'ai pas donné de nom au chat... donc le code "s'arrête" dans le bloc try puisque le catch a capturé l'exception qui a été lancée... Ok.
    MAIS, j'aimerais que si une exception est levée, alors l'objet devienne inutilisable en d'autres termes, le chat ne devrait pas faire miaou...
    J'ai tenté dans ma class d'exception (qui étend la class Exception de PHP) d'arrêter le "truc", en mettant un bête die; évidemment çà arrête tout... mais je voudrais simplement "arrêter" mon objet, et faire en sorte que le reste de la page s'affiche.

    Est-ce une bonne idée ? Ou une très mauvaise ?

  2. #2
    Membre Expert
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Par défaut Piste
    Salut,

    C'est plus un souci de conception: ne mets pas de catch dans ton constructeur, et alors c'est au code d'instantiation de traiter l'erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    try {
       $monChat = new Chat();		
       echo '<hr />';
       $monChat->miaou();
    }
    catch(Exception $e) {
       echo $e->getMessage();
    }
    ERE

  3. #3
    Membre éclairé Avatar de Huntress
    Femme Profil pro
    Inscrit en
    Août 2004
    Messages
    475
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 475
    Par défaut
    Salut,

    Oui de conception ! J'ai vainement cherché un sous-forum "conception" et c'est bien dommage qu'il n'y en ait pas, c'est important !

    Ahhh, c'est pas bête... ceci dit cela implique de "bien instancier"... et donc finalement de gérer les exceptions en dehors de la class... ce qui ne m'arrange pas. Car je souhaite que ma class soit automome, qu'elle se gère toute seule comme une grande.

    Donc si je reprends ma question initiale, à savoir est-ce bien ou mal ? Toi tu n'y vois pas d'inconvénient, çà ne serait pas "mal se servir des exceptions".
    Si qq'un d'autre veux faire partager son opinion, je suis preneuse.

    Pour le reste je vais donc tâcher de garder mes try catch au sein de ma class, et donc de faire en sorte que mes exceptions soient fatales à l'objet.

    Merci de ton aide ERE

  4. #4
    Membre Expert
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Par défaut
    Salut,

    Tu écrivais dans ton premier post:
    MAIS, j'aimerais que si une exception est levée, alors l'objet devienne inutilisable en d'autres termes, le chat ne devrait pas faire miaou...
    Si la class devient inutilisable, l'appelant doit le savoir et c'est à lui de prendre une décision. Quel intérêt pour ta class de gérer l'erreur ? Car là est à mon avis une erreur de conception: ce n'est pas à ta class de gérer l'erreur de l'appelant; si celui-ci ne fournit pas de nom c'est qu'il ne respecte pas la class Chat, et il est donc normal qu'il prenne une erreur en retour. C'est de la responsabilité du développeur de se conformer à l'utilisation de la class telle que son concepteur l'a pensée. Si le concepteur d'une class doit gérer les erreurs des utilisateurs, on n'en finit jamais...

    2 façons de "générer" cette erreur:
    1. En ne spécifiant pas de valeur par défaut dans le constructeur:
      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
      	<?php
      class Chat {
      	private $nom;
       
      	public function __construct($nom) {
      			$this->nom = $nom;
      	}
      	public function miaou() {
      		if (empty($this->nom)) throw new Exception("Le chat n'est pas encore né ! ");
      		echo 'miaou';
      	}
      }
       
      $monChat= null;
      try {
            $monChat = new Chat();
            echo '<hr />';
            $monChat->miaou();
      }
      catch(Exception $e) {
      	echo $e->getMessage();
      }
      ?>
      Ainsi génère au moins un warning PHP mais pas une erreur , par contre tu peux la générer lors de l'appel à miaou...
    2. En gérant le nom avec une valeur par défaut:
      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
      <?php
      class Chat {
      	private $nom='';
       
      	public function __construct($nom='') {
      		if(strlen(trim($nom)) != 0)
      			$this->nom = $nom;
      		else
      			throw new Exception('Vous devez donner un nom au chat !');
      	}
      	public function miaou() {
      		echo 'miaou';
      	}
      }
       
      try {
            $monChat = new Chat();
            echo '<hr />';
            $monChat->miaou();
      }
      catch(Exception $e) {
      	echo $e->getMessage();
      }
      ?>
      A noter que l'exception généré dans le constructeur interdit l'instanciation de la class, donc $monChat->miaou(); ne pourra jamais être appelé


    ERE

  5. #5
    Membre éclairé Avatar de Huntress
    Femme Profil pro
    Inscrit en
    Août 2004
    Messages
    475
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 475
    Par défaut
    "Quel intérêt pour ta class de gérer l'erreur ? Car là est à mon avis une erreur de conception: ce n'est pas à ta class de gérer l'erreur de l'appelant; si celui-ci ne fournit pas de nom c'est qu'il ne respecte pas la class Chat, et il est donc normal qu'il prenne une erreur en retour."

    Oui je suis d'accord... dans le cas du chat ; La class que je suis en train de faire est un poil plus compliquée, et il se pourrait que l'instanciation de la class, et/ou l'appel aux méthodes de la class se fasse de manière dynamique ; plus clairement dit : les paramètres passées aux méthodes, proviendraient d'un système d'information dont j'ignore tout. Et qui peut donc être truffé "d'erreurs" (ne me demande pas lesquelles).

    Et c'est là que se pose le problème, comment ne pas ruiner tout l'affichage du site qui utilise cette class, lorsque celle-ci est mal exploitée... par une base (et en évitant au développeur de lui faire ce travail de mise en place d'exception, ce qui de mon avis... n'est pas de son ressort... mais je débute l'objet et ma conception des choses est peut être très moyenne) ! L'instanciation faite par le développeur peut être nickel... mais si derrière on a une base complètement moisie...

    Est-ce que je me suis pris la tête trop fort, ou bien est-ce une réflexion justifiée ?

  6. #6
    Membre Expert
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Par défaut
    Re,

    Si en entrée tu as des données que tu ne maitrises pas, il me semble encore plus justifié de traiter les erreurs. Que ce soit le rôle du développeur ne me choque pas, il faut bien que quelqu'un s'en occupe... et ne pas le faire n'engendre que le report des problèmes. C'est ce que j'appelle habituellement familièrement le "théorème de conservation des emmerdements".

    ERE

  7. #7
    Membre éclairé Avatar de Huntress
    Femme Profil pro
    Inscrit en
    Août 2004
    Messages
    475
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 475
    Par défaut
    J'ai laissé mijoter tout ce que je tu m'as dit et effectivement je commence à changer mon point de vue.

    Je vais donc laisser les vannes ouvertes afin de ne pas accumuler les emmerdements.

    Donc à charge du développeur d'instancier un objet au sein d'un bloc try si il ne veut pas amocher sa page.

    Merci beaucoup pour tes éclairages.

  8. #8
    Membre Expert
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Par défaut
    Re,

    Pour finir, c'est exactement ce que tu précises:
    Donc à charge du développeur d'instancier un objet au sein d'un bloc try si il ne veut pas amocher sa page.
    C'est SA page, à lui de prendre ses responsabilités; de ton côté tu fournis une class irréprochable.

    ERE

  9. #9
    Membre éclairé Avatar de Huntress
    Femme Profil pro
    Inscrit en
    Août 2004
    Messages
    475
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 475
    Par défaut
    Irréprochable, irréprochable... ne nous emballons pas tout de même

  10. #10
    Membre Expert
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Par défaut
    Citation Envoyé par Huntress Voir le message
    Irréprochable, irréprochable... ne nous emballons pas tout de même
    Il fallait comprendre "tu dois fournir une class irréprochable."

    ERE

  11. #11
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Levée de l'exception dans la classe , interception dans l'appel.
    En revanche c'est dommage que l'on ai pas le droit a un petit warning en php quand on instancie une classe suceptible de levée une exception sans la placer dans un bloc try/catch , un peu comme en java.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  12. #12
    Membre éclairé Avatar de Huntress
    Femme Profil pro
    Inscrit en
    Août 2004
    Messages
    475
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 475
    Par défaut
    Ah donc toi (grunk) tu fais des thrown à tout va dans ta class, et tu fais ton new et tes appels de méthode de class au sein d'un try avec plein de catch ?

    Pas du tout de try catch dans ta class ?

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

Discussions similaires

  1. [POO] Gestion des exception avec php4
    Par mulot49 dans le forum Langage
    Réponses: 1
    Dernier message: 26/04/2007, 10h18
  2. [Oracle 8i - PL/SQL] Utilisation des exceptions
    Par Bahan dans le forum Oracle
    Réponses: 3
    Dernier message: 28/08/2006, 16h24
  3. [Exception] de l'utilisation des exceptions...
    Par Alec6 dans le forum Général Java
    Réponses: 7
    Dernier message: 16/09/2005, 17h53

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