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

  1. #1
    Membre averti 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
    Points : 402
    Points
    402
    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
    Expert confirmé
    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
    Points : 4 045
    Points
    4 045
    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 averti 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
    Points : 402
    Points
    402
    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
    Expert confirmé
    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
    Points : 4 045
    Points
    4 045
    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 averti 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
    Points : 402
    Points
    402
    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
    Expert confirmé
    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
    Points : 4 045
    Points
    4 045
    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 averti 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
    Points : 402
    Points
    402
    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
    Expert confirmé
    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
    Points : 4 045
    Points
    4 045
    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 averti 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
    Points : 402
    Points
    402
    Par défaut
    Irréprochable, irréprochable... ne nous emballons pas tout de même

  10. #10
    Expert confirmé
    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
    Points : 4 045
    Points
    4 045
    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 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

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

    Informations forums :
    Inscription : Août 2003
    Messages : 6 692
    Points : 20 243
    Points
    20 243
    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.

  12. #12
    Membre averti 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
    Points : 402
    Points
    402
    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 ?

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    Tout dépend. Une exception n'est jamais qu'un commutateur particulier. Une classe peut très bien gérer certaines exceptions qui lui sont propres tout en déléguant une autre partie qui est à gérer par la procédure.

    Même si on assimile souvent une exception à une erreur gérable, on peut les exploiter de manière beaucoup plus variée.

  14. #14
    Membre averti 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
    Points : 402
    Points
    402
    Par défaut
    Ahhh en fait il s'agit plus de mon optique surtout aujourd'hui, puisque j'ai admis l'utilisation des try catch en dehors de la class (merci emmanuel.remy)... et oui après "tant" d'années en procédural il est difficile d'appréhender certains aspects de la POO.

    Merci à vous 3 pour avoir partagé votre vision des choses, si il y a encore une âme généreuse qui tient à partager...

  15. #15
    Expert confirmé
    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
    Points : 4 045
    Points
    4 045
    Par défaut
    Citation Envoyé par Petibidon Voir le message
    Tout dépend. Une exception n'est jamais qu'un commutateur particulier. Une classe peut très bien gérer certaines exceptions qui lui sont propres tout en déléguant une autre partie qui est à gérer par la procédure.

    Même si on assimile souvent une exception à une erreur gérable, on peut les exploiter de manière beaucoup plus variée.
    Tout à fait d'accord et un point que je trouve personnellement important réside dans le fait d'avoir un graph d'Exception; ainsi l'exception générée peut porter une signification et proposer elle-même des méthodes de traitement. On a trop tendance à oublier qu'une exception est une class comme une autre, avec toute la richesse que cela offre.

    ERE

  16. #16
    Membre averti 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
    Points : 402
    Points
    402
    Par défaut
    Tu viens de piquer ma curiosité avec ton "graph d'Exception"... tu peux m'éclairer ?

    Pour le moment ma class d'exception qui étend Exception, se contente juste de formater un message d'erreur... qu'entends tu quand tu dis qu'elle peut proposer des méthodes de traitement ?

  17. #17
    Expert confirmé
    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
    Points : 4 045
    Points
    4 045
    Par défaut
    Salut,

    Désolé pour le contre-temps. Ce que je voulais dire c'est que tu peux créer par exemple une class AdminException qui dispose d'une méthode prevenirAdministrateur. Quand tu génères l'erreur tu renvoies un objet AdminException que tu as remplis (par exemple localisation, message d'erreur interne, message d'erreur utilisateur, gravité...). Le développeur peut alors mettre un code qui ressemblerait à quelque chose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    try {
        doTraitement(.....);
    } catch (AdminException $e) {
        if ($e->gravite>2) {
            //par ex: envoie d'un mail, log, ...
            $e->prevenirAdministrateur(); 
        }
        echo 'Erreur: ',  $e->getMessageUtilisateur() ";
    }
     catch (Exception $ex) {
        echo "Erreur: {$ex->getMessage()}\n";
    }
    Donc ton AdminException porte un service et n'est pas la uniquement pour sinifier qu'il y a eu une erreur. Et si tu gères l'héritage entre tes class d'exception (tu peux créer DaoException qui hérite de AdminException etc...) tu arrives à quelque chose que tu peux réutiliser tel quel dans l'ensemble de tes applications.

    ERE

  18. #18
    Membre averti 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
    Points : 402
    Points
    402
    Par défaut
    Citation Envoyé par emmanuel.remy Voir le message
    Désolé pour le contre-temps.
    Mais y'a pas de mal

    Ok, je faisais la même chose en procédural, concernant le fait de prévenir l'admin (donc moi) par mail en cas de grosse boulette.

    Sinon pour l'organisation d'une telle class c'est encore un peu flou... mais je suppose qu'avec le temps çà va s'éclaircir.

    Merci encore !

+ 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