JeuWeb - Crée ton jeu par navigateur
[Débat] "or die" ou "exception" ? - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [Débat] "or die" ou "exception" ? (/showthread.php?tid=4325)

Pages : 1 2 3 4 5


RE: [Débat] "or die" ou "exception" ? - naholyr - 07-09-2009

Attention, array_rand() renvoie un index, pas une valeur !
Code PHP :
<?php 
$smilies
= array(";-)", ":-P", ":-D", "X)", "T_T");
$smiley = $smilies[array_rand($smilies)];
Ou
Code PHP :
<?php 
$smiley
= array_rand(array_flip(array(";-)", ":-P", ":-D", "X)", "T_T")));

Tu vas y arriver x]


RE: [Débat] "or die" ou "exception" ? - Sephi-Chan - 07-09-2009

Je pourrais bien proposer la version Ruby, bien plus lisible :

[ ";-)", ":-P", ":-D", "X)", "T_T" ].shuffle.first

Mais il s'avère que la classe Array de Ruby propose une méthode built-in (donc plus performante) pour faire ça !

[ ";-)", ":-P", ":-D", "X)", "T_T" ].choice


Sephi-Chan, p'tain c'est chiant d'utiliser un langage qui roxx… Confusediffle:


RE: [Débat] "or die" ou "exception" ? - NicoMSEvent - 07-09-2009

très joliment écrit! (faut absolument que je termine ma béta, et que je m'y mette ^^)


RE: [Débat] "or die" ou "exception" ? - Ter Rowan - 07-09-2009

{troll inside}

un grand philosophe a écrit :

Citation :Ce n'est pas parce que c'est court que c'est forcément élégant.
Regardez les minijupes : tout dépend de la taille des cuisses qui les portent !


sinon sans avoir d'idée sur la question (je sais faire des die, les exceptions j'ai l'impression de comprendre même si je n'ai pas encore pratiqué), je n'arrive pas au vu de vos arguments à me faire un avis

donc, comme ça m'intéresse mine de rien, essayez d'autres types d'argument, parce que là ça arrive pas à me convaincre de l'un ou l'autre :'(


RE: [Débat] "or die" ou "exception" ? - guile - 07-09-2009

Wouarf naholyr, bien vu ;-)... il faut avouer que j'ai écrit ce bout de code à la volée, sans m'être documenté sur la fonction array_rand... j'aurais dû :-P

Pour les arguments die ou exceptions... c'est bien simple :
un die() :
hyper simple et rapide à mettre en place , donne un rendu dégueulasse côté client. Pour faire évoluer ce système, faudra se taper chaque die() ...
exception :
Pas facile à comprendre au début, mais de base, ce n'est pas si complexe que ça. Les exceptions peuvent très bien évoluer vers un système super bien foutu
la fonction maison qui fait un bon gros exit() :
Peut être aussi simple qu'un die() pour un rendu similaire, et peut être complexe comme une exception. Ca peut évoluer facilement (une fonction centralise tout), MAIS la complexité sera bien plus grande qu'avec les exceptions, au niveau fonctionnalité similaire.

Résultat : à chacun de voir ce qu'il veut faire.


RE: [Débat] "or die" ou "exception" ? - Ekilio - 07-09-2009

Si je devais donner un seul argument en faveur des exceptions, je dirais : la trace.

Les exceptions permettent, lorsqu'on les attrape, d'avoir la trace de toutes les fonctions qui ont été appellées, une après l'autre, avec leurs arguments, la ligne et le fichier de chacune, etc... jusqu'à savoir très exactement ce qui a causé l'erreur.

A vrai dire je ne vois strictement aucun avantage à or die()... J'ai beau chercher, j'en connais pas. C'est plus long à écrire et à utiliser, on a moins de renseignements, on ne peut pas en faire "ce qu'on veux"...

Un autre intérêt des exceptions est la possibilité d'en gérer plusieurs simplement. Petit exemple en code pour comprendre. Imaginons une situation : nous avons une administration, avec des administrateurs qui ont différents droits. En or die(), ça donnerais à peu près ça : (J'utilise des classes pour simplifier le code)

Code PHP :
<?php

// Connexion de l'utilisateur
$utilisateur = new utilisateur;
$utilisateur->connecter() or die('Login ou mot de passe incorrect');

// Vérification des droits d'accéder à cette partie
$utilisateur->verifierDroits('administration') or die('Droits incorrects');

// Vérification des paramètres passés
$parametres->verifier() or die('Modification impossible');

// Execution de la requête SQL voulue
$db::query('UPDATE machin') or die('Requête impossible à executer');

?>

Soit trois or die(). Si on veux les personnaliser, ça nous fait quatre fonctions (une pour demander la connexion, une pour dire qu'on ne peux pas acceder, une pour les erreurs SQL, une pour les erreurs de paramètres). C'est lourd, surtout qu'il y a plein plein d'autres or die possible.

Maintenant, avec les exceptions, il y a un truc génial, c'est qu'on peut étendre la classe exception. Et c'est là qu'elle prenne encore plus d'envergure, parce que ça nous donne ça :

Code PHP :
<?php

try {
$utilisateur = new utilisateur;
if(!
$utilisateur->connecter())
{
throw new
AuthException('Impossible de se connecter');
}

// Vérification des droits d'accéder à cette partie
if(!$utilisateur->verifierDroits('administration'))
{
throw new
AuthException('Droits insuffisants');
}

// Vérification des paramètres passés
if(!$parametres->verifier())
{
throw new
ErreurException('Les paramètres sont incorrects.', $parametres);
}

// Execution de la requête SQL voulue
if(!$db::query('UPDATE machin'))
{
throw new
ErreurException('La requête a échoué', 'UPDATE machin');
}
}
catch (
ErreurException $e)
{
log::logErreur($e);
}
catch(
AuthException $e)
{
header('location: login.php?message=' . $e->getMessage(), false, 401);
}
?>

Et là, c'est php qui va, tout seul, déterminer quel est le type d'erreur, et quel est l'action à effectuer. Bien sûr, on pourrait inclure les gestion (or die comme exception) dans nos classes ; mais si on fait un die('Requête incorrecte') dans une classe, comment on retrouve la requête qui merde sans relire tout son code pour retrouver la requête affichée ? Alors que l'exception a la gentillesse de nous le montrer. Un exemple :

Code PHP :
<?php

class maclass {

public function
lanceException()
{
$this->executeException(3);
}

private function
executeException($numero)
{
throw new
Exception('Erreur numéro ' . $numero);
}
}

try {
$exemple = new maclass;
$exemple->lanceException();
} catch (
Exception $e)
{
echo
'<pre>' . $e . '</pre>';
}
?>

Ce n'est bien sûr qu'un exemple. J'utilise là la classe de base de la SPL pour les exceptions. Franchement, pour arriver à la même chose avec un die, il faudrait beaucoup de boulot, non ? Alors que là, il suffit de linéariser l'exception et on obtient directement toutes les informations dont on a besoin pour débugguer ! Et pas de or die() partout dans le code à relire pour trouver où est le problème, pas de syntaxe complexes de fonction personnalisées, même pas de gestion d'erreur à faire dans le code des pages si le code des classes est bien fait : les exceptions remontent toutes seules jusqu'à trouver un try {} catch {}.

Bref, c'est plus simple, plus complet, plus précis et plus personnalisable qu'un or die(), à travail égal. Mais vous êtes libres d'utiliser or die(), hein...


RE: [Débat] "or die" ou "exception" ? - QuentinC - 07-09-2009

Citation :Les exceptions permettent, lorsqu'on les attrape, d'avoir la trace de toutes les fonctions qui ont été appellées, une après l'autre, avec leurs arguments, la ligne et le fichier de chacune, etc... jusqu'à savoir très exactement ce qui a causé l'erreur.
Ceci n'est malheureusement pas vrai : cf. fonction getDebugBacktrace.


RE: [Débat] "or die" ou "exception" ? - Ekilio - 07-09-2009

(07-09-2009, 10:49 PM)QuentinC a écrit :
Citation :Les exceptions permettent, lorsqu'on les attrape, d'avoir la trace de toutes les fonctions qui ont été appellées, une après l'autre, avec leurs arguments, la ligne et le fichier de chacune, etc... jusqu'à savoir très exactement ce qui a causé l'erreur.
Ceci n'est malheureusement pas vrai : cf. fonction getDebugBacktrace.

Heu... Je ne trouve pas cette fonction sur le manuel php ^^' Mais je ne vois pas en quoi ce n'est pas vrai ? cf l'exemple que j'ai donné dans le message et qui l'illustre exactement ^^'

Edit : je viens de comprendre : en fait, tu proposes d'utilise debug_backtrace() pour coder une fonction qui récupèrera le contexte d'une erreur, et sa trace ? Donc en gros, de recoder le système d'Exception intégré à php ? Quel intérêt, vu que ce sera fatalement plus lent qu'un truc pré-codé ? ^^'


RE: [Débat] "or die" ou "exception" ? - naholyr - 07-09-2009

L'objet Exception contient une méthode getTrace() et getTraceAsString() qui sont tout autant (voire plus) exploitables que debug_backtrace().


RE: [Débat] "or die" ou "exception" ? - QuentinC - 08-09-2009

Citation :L'objet Exception contient une méthode getTrace() et getTraceAsString() qui sont tout autant (voire plus) exploitables que debug_backtrace().
En effet. Mais c'était juste pour signaler qu'avoir un trace complet n'était pas uniquement possible qu'avec les exceptions.