JeuWeb - Crée ton jeu par navigateur
Gestion des erreurs basiques de la programmation - 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 : Gestion des erreurs basiques de la programmation (/showthread.php?tid=6630)



Gestion des erreurs basiques de la programmation - tghpow - 02-02-2013

Salut tout le monde!

Après avoir effectués différents tests basiques de fonctionnement sur ma classe Joueur, je me suis posé une question:

Mais tout d'abord le contexte:

J'ai une méthode "ressourceOK(pcoutBois,pcoutFer,pcoutOr)" qui test si le joueur a assez de ressource (je l'appel avant d'augmenter le niveau d'un batiment, ou de payer une autre amélioration..etc).

Durant mes ptits test, j'ai essayé avec des ressources négatives, et je me suis dit, que faire si j'en trouve?
Ne rien dire, forcer le passage en positif ou bien afficher un message d'erreur et m'envoyer une info personnel comme quoi il y a eu un événement étrange?*

*J'imagine que si les ressources sont négatives, c'est que soit j'ai fait le con et j'ai mal coder un truc, soit un gars s'est amusé a tester ma sécurité non?

Qu'en pensez-vous?

Amicalement,
Tghpow


PS: Je ne suis pas très bavard la dessus, j'attends d'avoir plus de contenus et de travail a montrer, mais mon projet avance bienSmile Pas assez a mon gout, a cause d'un manque de temps :p Dans 2 mois j'suis en stage de 3 mois avec de biens meilleurs horaires qu'en cours, et avec 2h40 de transport en commun en moins, et plus de TP a bosser le soir, donc j'espère rattraper mon retard durant cette période, et avoir un truc intéressant a vous présenter d'ici la fin de mon DUT :p


RE: Gestion des erreurs basiques de la programmation - php_addict - 03-02-2013

ba c'est simple...

tu as donc un jeu en ligne petit coquin, donc un public, tu dis rien du tout au sujet du bug!

tu fait un truc du genre "si négatif alors ZERO" tu log des trucs et des machins et tu debug...

ah moins que les joueurs concernés ayant des ressources negatives sont toujours les même et là y a carrément exploitation d'une faille dans ton jeu et tu peut toujours essayer de leur faire cracher le morceau...diplomatiquement parlant bien sur, genre dis moi et je t'offre toute ma gratitude...

et si vraiment tu trouves pas alors tu peut annoncer un truc du genre "aider moi à comprendre WTF" et une fois de plus je vous offre toute ma gratitude...

tiens nous au courant Wink


RE: Gestion des erreurs basiques de la programmation - Ter Rowan - 03-02-2013

Si tu considères anormal qu il y ait pas de ressources (bug ou triche) le mieux a mon sens est de générer une exception

Tu auras alors un gestionnaire d exceptions pour tous les cas de ce genre, et une gestion centralisée (log, erreur utilisateur, etc)


RE: Gestion des erreurs basiques de la programmation - Xenos - 03-02-2013

Je suis contre le "je passe le bug sous silence", car cela fausse tes hypothèses pour la suite de l'exécution du programme. Exemple:
- J'ai un stock de 100 unités de ressource
- Je demande une consommation de 200
- Mon stock est à -100
- Je mets en douce le stock à 0
Normalement, on a (hypothèse): Nouveau_Stock+Consommation = Ancien_Stock (ou Nouveau_Stock=Ancien_Stock-Consommation, c'est pareil).
Or, ici, ca ne marche pas: l'hypothèse est erronée. Donc passer sous silence le bugg, c'est bad.

Je rejoins donc Ter Rowan: si un comportement anormal arrive, il faut lancer une exception, et la rattrapper avant qu'elle ne tombe par terre (entend par là: avant que le serveur ne dise "Uncaught exception" au client, qui s'en fiche royalement).


RE: Gestion des erreurs basiques de la programmation - Sephi-Chan - 03-02-2013

Selon moi, ce n'est pas l'endroit où il faut se rendre compte de cette erreur. Si tu te retrouves avec du négatif alors que ça ne devrait pas être le cas, tu dois t'en apercevoir bien avant : avant d'insérer la valeur.

Pour ça, la solution est simple : tout changement de valeur doit passer par un API qui tu auras défini. Ainsi, c'est dans cet API que tu peux déclencher une exception (et à toi de voir si tu l'attrapes où non à un niveau supérieur de l'application).

Le test peut déjà avoir été fait en amont ou non mais peu importe : il sera refait au dernière moment (ce qui ne devrait pas être coûteux en ressources système dans la mesure où la structure est déjà en mémoire).

Dans tous les cas, il faut que l'application plante rapidement (politique du fail fast), pour empêcher qu'elle ne se mette dans un état problématique.


Voilà ce que j'écrirais (en Ruby, mais j'ai codé ça de manière la plus universelle possible) :


class Character
# Usage: character.withdraw_resources(gold: 20, wood: 90)
def withdraw_resources(resources)
resources.each do |type, amount|
current_amount = self.read_attribute("#{type}_amount")
new_amount = current_amount - amount

if new_amount < 0
raise NotEnoughResource, "Character has #{current_amount} of #{type} and can not be debited of #{amount}."
else
self.write_attribute("#{type}_amount", new_amount)
end
end

self.save
end


# Define a custom exception.
class NotEnoughResource < StandardError; end
end



RE: Gestion des erreurs basiques de la programmation - archANJS - 03-02-2013

Je déconseille aussi le passage sous silence ou la remise à zéro. Mieux vaut lancer une exception (log système ou message à toi et message d'erreur à l'utilisateur).


RE: Gestion des erreurs basiques de la programmation - tghpow - 03-02-2013

Merci de vos réponses.

Si j'ai bien compris, voici ce que je devrais faire:

Test de la "logique" des paramètres (ici sur les ressources)
-Si je tombe sur une erreur (ex: ressources négatives), alors je lève une exception et j'interdis l'amélioration du bâtiment, avec un petit message du genre : "Une erreur est survenue, veuillez nous en excuser" et je renvois l'utilisateur sur la page précédente.
-Si tout va bien, j'appelle ma méthode pour améliorer le bâtiment, et là encore une fois je refais le test comme la dit Sephi. Si je trouve encore une erreur, je relève une exception et je fais planter l'application.

C'est bien ca?


php_addict tu me conseille de ne pas révéler le bug à l'utilisateur, mais quelque part je suis bien obligé de lui dire qu'une erreur est survenue et qu'il doit refaire l'action précédente, je peux pas faire planter comme ça l'application non?

Merci de votre aide toujours aussi complète.