Oniromancie: Tutoriels - Les exceptions en Ruby


Comment ça marche?

Aëdemphia
Par Sylvanor

Fighting Robots Quest
Par Boulon

Forstale
Par Ødd Clock

Geex
Par roys

Inexistence
Par Falco

La Légende d'Ibabou
Par Zaitan

Lije
Par Gaetz

LoveMaster
Par Cuddlefox

Sarcia
Par Kaëlar

Super Mario RPG - Lost Souls
Par Omegabowser

Jeux: Monster World RPG / Jeux: Pif et Hercule / News: Mise à jour de RPG Maker 2003 / Tutos: Création de charset / Jeux: FAYLINAWA /

Chat  (24 connectés)

Bienvenue
visiteur !








Statistiques

Liste des
membres


Contact

57 connectés actuellement

9265284 visiteurs
depuis l'ouverture

544 visiteurs
aujourd'hui

Groupe Facebook

Barre de séparation

Partenaires




TOP
GAMEMAKING


Les 5 plus
visités

Lunae, le baz'arts d'Emz0

Le studio du chat vert

Pixelandgame

Tashiroworld

HeyMakeGames

Au hasard

Puissance RPG Maker

Kerox Production

RPG Maker Universe

Les deux derniers

Lunae, le baz'arts d'Emz0

Le studio du chat vert

Nos autres partenaires

Devenir
partenaire


Barre de séparation

Un site du réseau
War Paradise

Annuaires référenceurs




Les exceptions en Ruby
Ecrit par Denzel Lockheart$

Ici, je vous présenterai un outil utile pour gérer les erreurs en Ruby : les exceptions. Vous devez savoir que tout doit se
mettre dans un bloc d'instructions entre begin et end.

1) Gestion générale d'une exception

De manière générale, voici la démarche à suivre :


Portion de code:



begin 
	#Instructions d'erreur
rescue 	
	#Instructions de gestion de l'exception
end	



Pour donner l'exemple le plus simple, on va effectuer une division par zéro.


Portion de code:



begin 
	1/0
rescue ZeroDivisionError
	puts "Erreur : Division par zéro impossible !"
end



2) Instruction effectuée après une exception


Pour cela, on utilise le mot-clé ensure. C'est à peu près la même chose.


Portion de code:



begin 
	#Instructions d'erreur
rescue 	
	#Instructions de gestion de l'exception
ensure 
	#Instructions après la gestion de l'exception
end



En reprenant notre exemple, on aurait :


Portion de code:



begin 
	1/0
rescue ZeroDivisionError
	puts "Erreur : Division par zéro impossible !"
ensure	
	puts "Et voilà ! On a géré l'exception !"
end



3) Gérer l'exception avec une instruction de secours

Il est possible de rattraper le coup d'une exception grâce au mot-clé retry. Attention, car cette instruction s'exécute comme
une boucle infinie, donc initialisation obligatoire !


Portion de code:



begin 
	#Instructions d'erreur
rescue 	
	# Instructions de gestion de l'exception
	# Nouvelles instructions sans erreur
	retry # Pour réessayer
end



On va supposer que le dénominateur est cette fois une variable à initialiser.


Portion de code:



a=0
begin  
	5/a
rescue ZeroDivisionError
	puts "Erreur : Division par zéro impossible !"
	a=2
	retry	
end	
puts "Ouf ! On a réussi !"



A partir de là, vous saurez comment gérer une exception en Ruby de manière générale.


Denzel Lockheart$ - posté le 30/01/2010 à 21:44:39. (139 messages postés)

Webmasters anonymes

Normalement en RGSS, vous n'aurez pas cette exception à gérer, mais ça pourra servir pour gérer un système de fichiers externes sur le même schéma.

http://www.inlibroveritas.net/lire/oeuvre36096.html


Lufia - posté le 30/01/2010 à 22:39:49. (5792 messages postés)

Un Oniromancien. PVs 1, Attaque 0, Défense 0.

J'ai accepté ce tuto mais je trouve qu'il manque un peu de précision à certains endroits.

Le mot clé rescue utilisé sans rien après interceptera toutes les erreurs de type StandardError, soit une bonne partie des erreurs que l'on peut provoquer avec RM.
rescue ZeroDivisionError ne permettra de gérer que les erreurs de division par zéro.

ensure permet de s'assurer que du code dans un bloc sera toujours exécuté, qu'il y ait un erreur avant ou pas.

On peut utiliser rescue et ensure dans des définitions de méthode.

Une signature ? Pour quoi faire ?


Åvygeil - posté le 31/01/2010 à 00:57:04. (2432 messages postés)

C'est moi ou il manque un côté de la pièce ?

"Concernant Avygeil > tu peux avoir l'opinion que tu veux de lui, la mienne est que ce n'est qu'un crétin à tendances misogynes et homophobes [...] et, surtout, sans la moindre éducation : il débat comme un morveux de 8 ans, "non ta gueule j'ai raison toi t'as trop tort lol tu pues t'es con haha !". Même les gens les plus diplomates et les plus calmes (genre Gaetz) se sont tapés son comportement de blaireau. - 27/07/2015" Nemau a brisé mon petit cœur :'(


Denzel Lockheart$ - posté le 31/01/2010 à 10:23:06. (139 messages postés)

Webmasters anonymes

Effectivement, il manque certaines exceptions à gérer en RGSS mais je ne les ai pas évoquées car j'ai voulu faire beaucoup plus général avec une seule exception. Mais il est évident que ça peut totalement différent d'une exception à l'autre !

Par exemple pour RGSSError, ce sera totalement différent !

De toute façon, s'il fallait que je montre comment gérer toutes les exceptions, il y a aurait pour des pages de codes tellement le sujet est complet !

http://www.inlibroveritas.net/lire/oeuvre36096.html


Åvygeil - posté le 31/01/2010 à 10:42:33. (2432 messages postés)

Non mais attends, les exceptions, le principe c'est pas que de les intercepter.
Le principe c'est aussi d'en lever. L'autre côté de la pièce quoi.

"Concernant Avygeil > tu peux avoir l'opinion que tu veux de lui, la mienne est que ce n'est qu'un crétin à tendances misogynes et homophobes [...] et, surtout, sans la moindre éducation : il débat comme un morveux de 8 ans, "non ta gueule j'ai raison toi t'as trop tort lol tu pues t'es con haha !". Même les gens les plus diplomates et les plus calmes (genre Gaetz) se sont tapés son comportement de blaireau. - 27/07/2015" Nemau a brisé mon petit cœur :'(


Denzel Lockheart$ - posté le 31/01/2010 à 11:29:48. (139 messages postés)

Webmasters anonymes

Euh... J'ai pas trop compris, là !

J'avais pourtant utilisé toutes les clauses correctement et j'ai même testé avec la console Ruby intéractive fxri. Je ne comprends toujours pas, tu pourrais juste mettre un exemple concret ?

En même temps, je pourrais toujours demander à Lufia pour modifier et améliorer le tuto !

http://www.inlibroveritas.net/lire/oeuvre36096.html


Åvygeil - posté le 31/01/2010 à 12:04:07. (2432 messages postés)

Portion de code : Tout sélectionner

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
class MonException < Exception
  
  def to_s
    "Mon exception est levée !"
  end
  
end
 
def raise_monexception
  raise MonException
end
 
begin
  raise_monexception
rescue MonException => ex
  puts ex
end
 



L'utilisation de "raise" pour lever une exception quoi...
Je vois pas ce qui était *si dure* à comprendre dans ce que j'ai dit.
Franchement... franchement....

"Concernant Avygeil > tu peux avoir l'opinion que tu veux de lui, la mienne est que ce n'est qu'un crétin à tendances misogynes et homophobes [...] et, surtout, sans la moindre éducation : il débat comme un morveux de 8 ans, "non ta gueule j'ai raison toi t'as trop tort lol tu pues t'es con haha !". Même les gens les plus diplomates et les plus calmes (genre Gaetz) se sont tapés son comportement de blaireau. - 27/07/2015" Nemau a brisé mon petit cœur :'(


Lufia - posté le 31/01/2010 à 12:53:59. (5792 messages postés)

Un Oniromancien. PVs 1, Attaque 0, Défense 0.

"l'autre côté de la pièce", j'avais pas compris non plus. Sûrement parce que je compte en euros.

Tiens, Avy, vu que tu vas sûrement lire ce message, je voulais savoir, raise ça va forcément s'utiliser dans une condition, non ?

Ah, et dans la doc Ruby, j'ai vu ça sur rescue :

Portion de code : Tout sélectionner

1
2
3
4
5
6
  def file_reverser(file)
    File.open(file) {|fh| puts fh.readlines.reverse }
  rescue Errno::ENOENT
    log "Tried to open non-existent file #{file}"
    raise
  end


Utiliser raise comme ça, ça va faire tourner le programme en boucle, non ?

Ah, et j'aurais écrit ça :

Portion de code : Tout sélectionner

1
2
3
4
5
begin
  raise_monexception
rescue => ex
  puts ex.to_s if ex == MonException # Pas sûre de l'opérateur
end


C'pareil ?

Une signature ? Pour quoi faire ?


Åvygeil - posté le 31/01/2010 à 13:39:36. (2432 messages postés)

Point 1 : Non ça ne va pas faire tourner le programme en boucle.
Ce bout de code fait que si on lève une exception, on envoie u message dans le log, et on finit par planter.
L'exception levée par le "raise" dans "file_reverser" n'est pas interceptée parce qu'il est dans le rescue, pas le bloc principal.

Point 2 : Non ce n'est pas pareil.
"rescue" tout seul marche si l'exception ex est une StandardError si je me rappelle bien. Ce qui n'est pas le cas pour MonException.
Et "ex == MonException" n'a pas de sens, vu que "ex" est un instance de "MonException", pas la classe elle-même.
Et tester le type de l'exception c'est très mauvais, plutôt faire :

Portion de code : Tout sélectionner

1
2
3
4
5
6
7
8
9
 
begin
  # du code...
rescue MonException1 => ex
  puts ex
rescue MonException2 => ex
  puts ex
end
 

"Concernant Avygeil > tu peux avoir l'opinion que tu veux de lui, la mienne est que ce n'est qu'un crétin à tendances misogynes et homophobes [...] et, surtout, sans la moindre éducation : il débat comme un morveux de 8 ans, "non ta gueule j'ai raison toi t'as trop tort lol tu pues t'es con haha !". Même les gens les plus diplomates et les plus calmes (genre Gaetz) se sont tapés son comportement de blaireau. - 27/07/2015" Nemau a brisé mon petit cœur :'(


Denzel Lockheart$ - posté le 31/01/2010 à 13:53:23. (139 messages postés)

Webmasters anonymes

Ben merci du conseil ! Je pensais pas qu'il fallait approfondir jusqu' ici !

Je vais renvoyer le tuto avec les nouveaux éléments car sinon, je vais encore me taper la honte !

Sinon, Lufia peut supprimer le tuto en attendant une nouvelle version si ça dérange en attendant.

http://www.inlibroveritas.net/lire/oeuvre36096.html


Zeus81 - posté le 31/01/2010 à 19:49:07. (11072 messages postés)

Quel succès n'empêche ces tutos, ça n'intéresse que ceux qui savent déjà programmer. :'-)
Et j'ai du mal à comprendre en quoi un débutant aurait besoin des exceptions.
J'sais pas, je préfère vérifier si le dénominateur est égal à zéro plutôt que de faire une exception, c'est moins lourd.

Et pour ne pas poster inutilement, je rajouterai que pour récupérer l'erreur on peut utiliser $! plutôt que de mettre => ex
qu'on peut récupérer le message d'erreur avec $!.message
et la ligne avec $!.backtrace


Denzel Lockheart$ - posté le 31/01/2010 à 21:00:51. (139 messages postés)

Webmasters anonymes

Je pense que vous n'avez pas compris que c'est juste pour le principe. J'aurais pu être beaucoup plus général, mais je vais de toute façon changer le contenu de ce tuto.

http://www.inlibroveritas.net/lire/oeuvre36096.html

Suite à de nombreux abus, le post en invités a été désactivé. Veuillez vous inscrire si vous souhaitez participer à la conversation.

Haut de page

Merci de ne pas reproduire le contenu de ce site sans autorisation.
Contacter l'équipe

Plan du site:

Activité: Accueil | News | Forum | Flash-news | Chat | Commentaires | Galerie | Screen de la semaine | Sorties | Articles perso | Livre d'or | Recherche
Jeux: Index jeux séparés | Top Classiques | Top Originaux | Les autres | RPG Maker 95 | RPG Maker 2000 | RPG Maker 2003 | RPG Maker XP | RPG Maker VX | RPG Maker VX Ace | RPG Maker MV | Autres | Jeux complets | Proposer
Rubriques: Le Wiki | Collection Oniro | Tutoriaux | Scripts | Guides | Gaming-Live | Tests | Making-of | Interviews | Articles perso | OST | L'Annuaire | Divers | Palmarès
Hébergés: Aëdemphia | Fighting Robots Quest | Forstale | Geex | Inexistence | La Légende d'Ibabou | Lije | LoveMaster | Sarcia | Super Mario RPG - Lost Souls
Ressources: Jeux | Programmes | Packs de ressources | Midis | Eléments séparés | Sprites
RPG Maker 2000/2003: Chipsets | Charsets | Panoramas | Backdrops | Facesets | Battle anims | Battle charsets | Monstres | Systems | Templates
RPG Maker XP: Tilesets | Autotiles | Characters | Battlers | Window skins | Icônes | Transitions | Fogs | Templates
RPG Maker VX: Tilesets | Charsets | Facesets | Systèmes
RPG Maker MV: Tilesets | Characters | Faces | Systèmes | Title | Battlebacks | Animations | SV/Ennemis