Exception dans un IF

Résolu/Fermé
biche_35 Messages postés 34 Date d'inscription mercredi 4 décembre 2013 Statut Membre Dernière intervention 1 août 2017 - Modifié par biche_35 le 10/12/2013 à 10:01
 Utilisateur anonyme - 10 déc. 2013 à 18:08
Bonjour,
Je suis un peu embêter sur un programme que je cherche à faire...

J'ai une boucle de cette forme :

for addresses in bigip1_obj.get_list():
 s_addresses = str(addresses)[8:]
 g_list = bigip1_obj.get_traffic_group(virtual_addresses = [s_addresses])
 s_liste = str(g_list)
 if (s_addresses[10:] > 128 and s_liste[-2] == '1'):
  print ("Pour la virtuelle portant l'IP %s, le traffic group correspondant n'est pas bon" %(s_addresses))
 else:
  print("Pour la virtuelle portant l'IP %s, le traffic group correspondant est bon" %(s_addresses)) 
</code>

Actuellement ce script fonctionne nikel hors mis dans une situation. Quand ma boucle va tourner, il tombera une seul fois sur addresses ='any'.
Cela provoque un problème car any ne contient pas 8 caractère (str(addresses)[8:]).


Je possède donc une erreur de ce type : IndexError: string index out of range

Avez vous une idée pour gérer ce 'any'

Merci d'avance de vos conseils




13 réponses

Utilisateur anonyme
10 déc. 2013 à 14:10
try:
s_addresses = str(addresses)[8:]
except IndexError:
# traitement au cas où on a le terme 'any'
0
biche_35 Messages postés 34 Date d'inscription mercredi 4 décembre 2013 Statut Membre Dernière intervention 1 août 2017
10 déc. 2013 à 14:22
Salut,
Merci de ton aide déjà ;)

Voci donc ma nouvelle boucle aprés modification :
for addresses in bigip3_obj.get_list():
	try:
		s_addresses = str(addresses)[8:]
	except IndexError:	
			g_list = bigip3_obj.get_traffic_group(virtual_addresses = [s_addresses])
			s_liste = str(g_list)
	print s_addresses[7]
	if (s_addresses[7] == '2' and s_liste[-2] == '2' and s_addresses != 'any'):
		print ("Pour la virtuelle portant l'IP %s, le traffic group correspondant n'est pas bon" %(s_addresses))
	else:
		print("Pour la virtuelle portant l'IP %s, le traffic group correspondant est bon" %(s_addresses))


Mon traitement commence et au bout de la 5ème valeur de s_adrdresses, j'ai le message d'erreur suivant :
Traceback (most recent call last):
File "<stdin>", line 8, in <module>
NameError: name 's_liste' is not defined

Un problème d'indentation peut ètre??
Encore merci
0
Utilisateur anonyme
10 déc. 2013 à 15:46
Non, c'est un problème dans le sens où tu crées ta variable s_liste que dans le cas où tu vois la valeur 'any'.

La solution est de placer avant le try ta variable s_liste à la valeur None

s_liste = None
try:
# ....
0
biche_35 Messages postés 34 Date d'inscription mercredi 4 décembre 2013 Statut Membre Dernière intervention 1 août 2017
Modifié par biche_35 le 10/12/2013 à 16:39
Donc tu suggère de faire ça :
for addresses in bigip3_obj.get_list():
        s_liste = 'None'
 try:
  s_addresses = str(addresses)[8:]
 except IndexError: 
   g_list = bigip3_obj.get_traffic_group(virtual_addresses = [s_addresses])
   s_liste = str(g_list)
 print s_addresses[7]
 if (s_addresses[7] == '2' and s_liste[-2] == '2' and s_addresses != 'any'):
  print ("Pour la virtuelle portant l'IP %s, le traffic group correspondant n'est pas bon" %(s_addresses))
 else:
  print("Pour la virtuelle portant l'IP %s, le traffic group correspondant est bon" %(s_addresses))


Je test et je te tiens au courant.
Encore merci ;)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
biche_35 Messages postés 34 Date d'inscription mercredi 4 décembre 2013 Statut Membre Dernière intervention 1 août 2017
10 déc. 2013 à 16:41
Malheureusement, je retombe sur mon problème initial avec un "IndexError: string index out of range" lorsque s_addresses = any
0
Tu as vraiment un problème avec l'indentation :)

for addresses in bigip3_obj.get_list():
s_liste = 'None'
try:
s_addresses = str(addresses)[8:]
except IndexError:
g_list = bigip3_obj.get_traffic_group(virtual_addresses = [s_addresses])
s_liste = str(g_list)
print s_addresses[7]
if (s_addresses[7] == '2' and s_liste[-2] == '2' and s_addresses != 'any'):
print ("Pour la virtuelle portant l'IP %s, le traffic group correspondant n'est pas bon" %(s_addresses))
else:
print("Pour la virtuelle portant l'IP %s, le traffic group correspondant est bon" %(s_addresses))

Non testé, mais ça a déjà plus de gueule...
0
biche_35 Messages postés 34 Date d'inscription mercredi 4 décembre 2013 Statut Membre Dernière intervention 1 août 2017
10 déc. 2013 à 17:18
Effectivement, je suis encore un peu débutant sous Pyhton (je commence depuis cette semaine :) )

Toujours le même problème. J'obtiens un IndexError: string index out of range.

Vois pas pourquoi ce str(addresses)[8:] est si bloquant que ça...
0
Non il n'est pas bloquant à cet endroit, il faut que tu places dans ton bloc try, tous ce qui pourrait poser problème en rapport avec ton 'any'...

Je ferais cela de cette façon

for addresses in bigip3_obj.get_list():
s_liste = 'None'
try:
s_addresses = str(addresses)[8:]
print s_addresses[7]
if (s_addresses[7] == '2' and s_liste[-2] == '2'):
print ("Pour la virtuelle portant l'IP %s, le traffic group correspondant n'est pas bon" %(s_addresses))
else:
print("Pour la virtuelle portant l'IP %s, le traffic group correspondant est bon" %(s_addresses))
except IndexError:
g_list = bigip3_obj.get_traffic_group(virtual_addresses = [s_addresses])
s_liste = str(g_list)
# dans le cas d'any, on en fait quoi?
0
biche_35 Messages postés 34 Date d'inscription mercredi 4 décembre 2013 Statut Membre Dernière intervention 1 août 2017
10 déc. 2013 à 17:27
Dans le cas d'any, je propose qu'on ne fasse rien ;)
Je ne sais pas si ta question est directe ou si c'est juste un fail dans tes balises /code
0
biche_35 Messages postés 34 Date d'inscription mercredi 4 décembre 2013 Statut Membre Dernière intervention 1 août 2017
10 déc. 2013 à 17:30
Pour info, ça fonctionne ;)
Peux tu m'expliquer ce que tu fais aprés ton except IndexError:

Je ne connais pas trop la construction du try/except

Préfère comprendre plutôt que de faire un simple Copy/Cut
0
Utilisateur anonyme
10 déc. 2013 à 17:39
Le bloc try-except, c'est pour dire

J'essaie
...
...
...
excepté dans le cas où l'index dépasse la taille de la chaine je fais
...
...
...

try -> essayé
except -> excepté
0
biche_35 Messages postés 34 Date d'inscription mercredi 4 décembre 2013 Statut Membre Dernière intervention 1 août 2017
10 déc. 2013 à 17:51
Et ben chapeau !!!
Merci de ton aide et de tes explications.

J'ai grâce à toi quelque chose qui fonctionne à merveille et j'ai accessoirement réussi à faire mon premier code Python (avec un peu d'aide) ;)


A bientôt pour une nouvelle question :D

Problème résolu
0
Utilisateur anonyme
10 déc. 2013 à 18:08
A bientôt ;)
0