8796 sujets

Développement web côté serveur, CMS

Modérateur
Bonsoir tout le monde,

Je me pose une petite question à propos de l'écriture d'une exception. Est-il bon d'écrire comme ceci :

class uneClass{
	private $uneVar,$uneAutreVar;

	public function __construct($uneVar, $uneAutreVar){
		$this->uneVar = $uneVar;
		$this->uneAutreVar = $uneAutreVar;
	}

	public function uneMethode(){
		try{
			if($this->uneVar !== $this->uneAutreVar){
				throw new exceptionFille ("Erreur etc.");
			}
		}catch(exceptionFille $e){
			$e->getMessage();
		}
	}
}


ou plutôt comme cela :

class uneClass{
	private $uneVar,$uneAutreVar;

	public function __construct($uneVar, $uneAutreVar){
		$this->uneVar = $uneVar;
		$this->uneAutreVar = $uneAutreVar;
	}

	public function uneMethode(){
		if($this->uneVar !== $this->uneAutreVar){
			throw new exceptionFille ("Erreur etc.");
		}
	}
}


Si vous pouviez m'indiquer le type d'écriture correct et me dire le pourquoi du comment, je vous en remercierez grandement. Smiley smile


Bonne soirée.
Modifié par Nolem (27 Sep 2009 - 14:12)
Salut,

ben c'est difficile de répondre hors contexte... Cela dit quelques remarques :

1ère version :

* $e->getMessage(); seul ne sert à rien contrairement à echo $e->getMessage();

* ton bloc try / catch qui se contente de lancer une exception et de l'attraper tout de suite n'a aucun intérêt.

pour les 2 versions : pourquoi compliquer ta question en utilisant une exception étendue plutôt qu'une simple ?


Quoi qu'il en soit voilà un petit exemple "en situation" :
class uneClass{

    private $uneVar,$uneAutreVar; 
 
    public function __construct($uneVar, $uneAutreVar){ 
        $this->uneVar = $uneVar; 
        $this->uneAutreVar = $uneAutreVar; 
    } 
 
    public function uneMethode(){ 
		if($this->uneVar !== $this->uneAutreVar){ 
			throw new Exception ("Erreur : ".$this->uneVar." et ".$this->uneAutreVar." ne sont pas équivalents !"); 
		} 
    } 
} 

try {
	$uneClass = new uneClass(1, 1);
	$uneClass->uneMethode();
	$uneAutreClass = new uneClass(1, 2);
	$uneAutreClass->uneMethode();
} catch (Exception $e) {
	echo $e->getMessage();
}
A noter que puisque le test sur les valeurs passées en paramètre est effectué dans une méthode et non lors de l'instanciation ce serait plus logique que ce soit cette méthode qui reçoive les paramètres en question.
La 2ème bien sûr !
Le programme appelant utilise une méthode, une exception est lancé, il la capture et peut faire un traitement approprier : afficher le message, réessayé avec de nouveau paramètre, enregistré dans un fichier, etc). Alors qu'avec la première méthode c'est impossible et le code continu normalement.
L'exception doit-être récupéré par le programme parent, sinon, comment savoir qu'une exception à été lancé ?

Pour la route un exemple hyper bidon où le programme récupère l'exception et effectue une action spéciale. Smiley biggol


<?php
//Le but est de rangé le robocop géant dans les cartons à disposition

//conteneur de 2 cartons
$cartons = new SplFixedArray(2);
//carton de largeur 700mm, hauteur et profondeur de 400mm
$cartons[0] = new Carton(700, 400, 400);
//carton de largeur 1000mm, hauteur 800mm et profondeur de 500mm
$cartons[1] = new Carton(1000, 800, 500);

foreach($cartons as $num => $carton)
{
    try
    {
        //range un jouet dans le carton (un robocop géant d'hauteur 1m xD)
        $carton->ranger(new Robocop);
        //la chambre est rangé, c'est terminé \o/
        echo "Robocop est dans le carton $num.\n";
        break;
    }
    catch(Exception $e)
    {
        echo "Carton n° $num : {$e->getMessage()}. Ce carton est inutile brulons le !";
        $carton->bruler(); //mwahaha haha
    }
}

/*sortie :
Carton n°1 : Robocop ne peux pas rentré. Ce carton est inutile brulons le !
Robocop est dans le carton 2.
*/
?>


Euuuh c'est normal que le code au-dessus disparais Smiley bawling ?
Modifié par jo_link_noir (21 Sep 2009 - 23:25)
Modérateur
Bonsoir Heyoan et jo_link_noir, Smiley smile

Heyoan a écrit :

...
* $e->getMessage(); seul ne sert à rien contrairement à echo $e->getMessage();
...


ah oui oups Smiley confused . J'ai écrit un peu vite le code sans exécuter.

Heyoan a écrit :

...
* ton bloc try / catch qui se contente de lancer une exception et de l'attraper tout de suite n'a aucun intérêt.

pour les 2 versions : pourquoi compliquer ta question en utilisant une exception étendue plutôt qu'une simple ?
...

Je ne comprend pas bien ce que tu veux me dire ?
Le script que j'ai donné, c'était un pur exemple d'une class quelconque. En fait, mon idée est de faire une ou deux petites classes avec son/leurs exception(s) fille(s) qui va/vont bien(s) et suivant les besoins. Ma question est plutôt, est il préférable de mettre le bloc try ... catch dans une méthode :

class uneClass{ 
    private $uneVar,$uneAutreVar; 
 
    public function __construct($uneVar, $uneAutreVar){ 
        $this->uneVar = $uneVar; 
        $this->uneAutreVar = $uneAutreVar; 
    } 
 
    public function uneMethode(){ 
        try{ 
            if($this->uneVar !== $this->uneAutreVar){ 
                throw new Exception ("Erreur : ".$this->uneVar." et ".$this->uneAutreVar." ne sont pas équivalents !"); 
            }else{
                return "Alsacréations, un super site !";
            } 
        }catch(Exception $e){ 
            echo $e->getMessage(); 
        } 
    } 
}

$uneClass = new  uneClass(1, 1); 
echo $uneClass->uneMethode();
 
$uneAutreClass = new uneClass(1, 2); 
echo $uneAutreClass->uneMethode(); 

ou lors de l'instanciation :

class uneClass{ 
 
    private $uneVar,$uneAutreVar;  
  
    public function __construct($uneVar, $uneAutreVar){  
        $this->uneVar = $uneVar;  
        $this->uneAutreVar = $uneAutreVar;  
    }  
  
    public function uneMethode(){  
        if($this->uneVar !== $this->uneAutreVar){  
            throw new Exception ("Erreur : ".$this->uneVar." et ".$this->uneAutreVar." ne sont pas équivalents !");  
        }else{
                return "Alsacréations, un super site !";
        }
    }  
}
try { 
    $uneClass = new uneClass(1, 1); 
    echo $uneClass->uneMethode(); 
    $uneAutreClass = new uneClass(1, 2); 
    echo $uneAutreClass->uneMethode(); 
} catch (Exception $e) { 
    echo $e->getMessage(); 
}



jo_link_noir a écrit :

Le programme appelant utilise une méthode, une exception est lancé, il la capture et peut faire un traitement approprier : afficher le message, réessayé avec de nouveau paramètre, enregistré dans un fichier, etc). Alors qu'avec la première méthode c'est impossible et le code continu normalement.
L'exception doit-être récupéré par le programme parent, sinon, comment savoir qu'une exception à été lancé ?


Comme tu peux le voir, les deux codes fonctionnent et le résultat reste le même. On peut également faire la même chose (afficher le message, réessayé avec de nouveau paramètre, enregistré dans un fichier, etc) avec ces deux styles d'écriture. Cependant, je pense qu'il doit bien y avoir une manière d'écrire et qu'il y a bien une raison.

Bonne soirée à vous.
Modifié par Nolem (22 Sep 2009 - 00:54)
Nolem a écrit :
Le script que j'ai donné, c'était un pur exemple d'une class quelconque. En fait, mon idée est de faire une ou deux petites classes avec son/leurs exception(s) fille(s) qui va/vont bien(s) et suivant les besoins. Ma question est plutôt, est il préférable de mettre le bloc try ... catch dans une méthode
Eh bien tout dépend de ce que tu veux faire...

Exemple 1 (en cas d'exception on sort tout de suite) :
class uneClass{

    private $uneVar,$uneAutreVar; 
 
    public function __construct($uneVar, $uneAutreVar){ 
        $this->uneVar = $uneVar; 
        $this->uneAutreVar = $uneAutreVar; 
		// Test quelconque sinon on arrête tout
		if($this->uneVar !== $this->uneAutreVar){ 
			throw new Exception ("Erreur : ".$this->uneVar." et ".$this->uneAutreVar." ne sont pas équivalents !"); 
		} 
		// OK on continue
		$this->uneMethode();
    } 
 
    private function uneMethode(){ 
		echo '<p>Ici on fait quelque chose...</p>';
    } 
} 

try {
	$uneClass =new uneClass(1, 2);
	$uneClass->uneMethode();
} catch (Exception $e) {
	echo "<p>Impossible d'instancier uneClass</p>";
	echo $e->getMessage();
}


Exemple 2 (try / catch dans la class) :
class uneClass{

    private $uneVar,$uneAutreVar; 
 
    public function __construct($uneVar, $uneAutreVar){ 
        $this->uneVar = $uneVar; 
		// Exemple idiot permettant une division par zéro
		for($this->uneAutreVar = $uneAutreVar; $this->uneAutreVar > -3; $this->uneAutreVar--) {
			try {
				$this->uneMethode();
			} catch (Exception $e) {
				echo $e->getMessage();
			}
		} 
    } 
 
    private function uneMethode(){ 
		if(!$this->uneAutreVar) {
			throw new Exception('Attention : division par zéro !');
		}
		$ratio = $this->uneVar / $this->uneAutreVar;
		echo '<p>'. $this->uneVar .'/'. $this->uneAutreVar.'='.$ratio.'</p>';
    } 
} 

$uneClass =new uneClass(12, 3);

Concernant les exceptions étendues (je ne vois pas bien ce que tu veux dire par "exception fille") voir cet article.
Modérateur
Hello Heyoan, Smiley smile

Désolé si je répond un peu tardivement. J'étais un peu occupé ces jours-ci.

Heyoan a écrit :
Eh bien tout dépend de ce que tu veux faire...


Au fur et à mesure, je prépare un « petit » projet (euphémisme). Je vais surement éviter de réécrire du code existant en récupérant divers objets (pear en exemple). Cependant, il y a de grandes chances que je fasse moi même quelques class suivant ce que je veux faire.

En relisant divers documents, je ne me souvenais pas que l'on pouvait concaténer les exceptions. J'avais un peu peur de réécrire du code relativement erroné suite à une mauvaise gestion d'exception. J'ai aussi l'impression qu'il n'y a pas vraiment de règle sur ce sujet. Une bonne préparation au préalable devrait faire l'affaire me semble t'il.

Heyoan a écrit :
... Concernant les exceptions étendues (je ne vois pas bien ce que tu veux dire par "exception fille") ...


Je parlais d'héritage afin d'étendre les fonctionnalités de la class « Exception ».

En tout cas je vous remercie à vous deux de vos réponses à propos de mon petit tracas.

Bien Amicalement