2016-03-29 1 views
-1
try: 
    left_break = signs_pos[dave - 1] 
except IndexError: 
    left_error = True 

try: 
    right_break = signs_pos[dave + 1] 
except IndexError: 
    right_error = True 

if left_error == True: 
    current_cal = user_input[:right_break] 
elif right_error == True: 
    current_cal = user_input[left_break:] 
else: 
    current_cal = user_input[left_break:right_break] 

J'ai seulement commencé à regarder des fonctions d'essai et j'ai besoin de l'aide avec ceci. Qu'est-ce que je voudrais arriver est que si quand il essaie de trouver left_break et il donne une erreur, il sera mis à left_error être vrai. Mais si cela ne donne pas d'erreur, left_break sera positionné correctement. Lorsque le code s'exécute et que le code à droite ou à gauche ne donne pas d'erreur, il ne définit pas correctement left_break ou right_break.Essayez la fonction ne fonctionne pas correctement

Traceback (most recent call last): 
    File "C:\Users\Max\Desktop\MaxsCal.py", line 170, in <module> 
    current_cal = user_input[:right_break] 
NameError: name 'right_break' is not defined 

C'est l'erreur que je reçois sans la fonction try.

Traceback (most recent call last): 
    File "C:\Users\Max\Desktop\MaxsCal.py", line 157, in <module> 
    right_break = signs_pos[dave + 1] 
IndexError: list index out of range 

Les erreurs right_error et left_error ne seront pas vraies.

+3

Il est un 'NameError' pas' IndexError' – JeD

+0

Votre code ne gère pas la situation dans laquelle les deux déclarations 'try' exécutent le' l'exception 'partie. Avez-vous les variables 'left_break' et' right_break' définies 'False' avant cette partie du code? – Leva7

+0

Cela peut être dû au fait que 'left_error' et' right_error' sont 'True' quand aucun des blocs' try' ne s'exécute, donc la première instruction 'if' est évaluée et trouve que' right_break' n'a pas été créé. –

Répondre

0

left_break et right_break sont seulement disponibles dans le cadre du bloc try. Vous pouvez les définir avant le bloc try/except ou ajouter un bloc else à l'exception, comme indiqué dans this thread.

3

La raison pour laquelle cela se produit, est que parce que vous essayez d'affecter quelque chose à une variable dans un try/except, il n'existera pas réellement si vous avez déclenché une exception.

Voici un exemple simple de clarifier ceci:

try: 
    x = 6/0 
except ZeroDivisionError: 
    print('this failed') 
print(x) 

>>> print(x) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'x' is not defined 

Maintenant, pour remédier à cette situation et que vous cherchez à utiliser réellement la variable même si elle échoue dans le try/except, vous voulez déclarer avant vous appelez la chose qui pourrait échouer.

x = 0 
try: 
    x = 6/0 
except ZeroDivisionError: 
    print('this failed') 
print(x) 

>>> print(x) 
>>> 0 

Ou même à l'intérieur de vos œuvres d'essayer, mais avant ce que vous appelez:

try: 
    x = 0 
    x = 6/0 
except ZeroDivisionError: 
    print('this failed') 
print(x) 

>>> print(x) 
>>> 0 

En ce qui m'a mentionné dans les commentaires, vous pouvez également définir une valeur par défaut dans votre except:

try: 
    x = 6/0 
except ZeroDivisionError: 
    print('this failed') 
    x = 0 
print(x) 

>>> print(x) 
>>> 0 
+2

Vous pouvez également donner un défaut dans l'exception –

+1

@PadraicCunningham C'est vrai! Bon appel. Merci – idjaw

0

Votre erreur vient du fait que la variable est hors de portée. pause droit est seulement portée dans le bloc try, changer pour

right_break = None 
try: 
    right_break = signs_pos[dave + 1] 
except IndexError: 
    right_error = True