EXCEPTION (EXCEPTION, MYSQL ET FILEEXCEPTION)

webdeb Messages postés 488 Date d'inscription samedi 5 avril 2003 Statut Membre Dernière intervention 31 mars 2009 - 10 juin 2007 à 22:59
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 - 11 juin 2007 à 19:25
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/43064-exception-exception-mysql-et-fileexception

FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
11 juin 2007 à 19:25
Pas mal, pas mal :)
2 voir 3 ptites choses quand même :

public function nbrThrow(){
return Exception747::$NbrThrow;
}
public function nbrThrow(){
return MysqlException::$NbrThrow;
}

Y'a de la re déclaration en trop ici. Théoriquement, tu devrais pouvoir faire (dans ta classe parente ):
static public function nbrThrow() {
return self::$NbrThrow;
}
Normalement, elles doivent pouvoir jouer avec les classes filles (étant donné que le nom de la propriété statique est la même).

Cependant, je vois comme un ptit problème de conception.
$NbrThrow, tu l'utilises dans ta classe parente, et que tu re-déclares par la suite dans tes classes filles. Les classes filles n'ont pas à savoir combien de Throw() ont été lancés, en effet, seule la classe parente doit s'en occuper. Ce qui aurait été plus judicieux (mais un peu plus gourmand je l'admet), c'est couper la poire en 2 :

class Exception747 extends Exception {
static private $TotalThrow = 0;
public function __construct(...) {
self::$TotalThrow++;
}
}
class MySQLException extends Exception747 {
static protected $Throw = 0;
public function __construct(...) {
parent::__construct(....);
self::$Throw++;
}

Encore que, on aurait pu faire quelque chose comme ca aussi :

class Exception747 extends Exception {
static private $AllThrows = null;
static private $CountAllThrows = 0;
public function __construct($msg, $name) {
self::$AllThrows[$name]++;
self::$CountAllThrows++;
}
static public function getCountThrowsFor($string = 'all') {
$string = strtolower($string);
if ( $string === 'all' )
return self::$CountAllThrows;
elseif ( isset( self::$AllThrows[$string] ) )
return self::$AllThrows[$string];
else
return 0;
}

}
class MySQLException extends Exception747 {
public function __construct(...) {
parent::_construct($msg, 'mysql' );
}

Ce qui permet tout de même de faire :
try {
...
...
} catch ( MySQLException $mysql_e ) {
//
}
try {
...
...
} catch ( MySQLException $mysql_e ) {
//
} catch ( FileException $file_e ) {
//
}

echo 'Nombre d\'exceptions lancées : '.Exception747::getCountThrowsFor('all').' dont '.Exception747::getCountThrowsFor('mysql').' pour MySQL et '.Exception747::getCountThrowsFor('file').' pour les fichiers.';

Eventuellement, dans ce concept, tu peux aussi vérifier l'appel de la classe dans la méthode pour éviter de faire passer via paramètre ce que tu veux rechercher.

C'est une question de point de vue de programmation de toute facon, mon avis n'a pas besoin d'être forcément suivi car ta solution est tout aussi viable. Ma solution est plus lourde aussi... ce qui peut être handicapant.


Le reste y'a rien à dire de toute facon :)
Bravo :)
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
11 juin 2007 à 00:13
Merci
webdeb Messages postés 488 Date d'inscription samedi 5 avril 2003 Statut Membre Dernière intervention 31 mars 2009 4
10 juin 2007 à 22:59
Bah je crois que je vais tester tout ça moi :) Ca me semble bien cool ton appli Coucou747