0
votes

Je reçois une erreur lors de l'exécution de ce code, STR1 n'est pas défini, quand je l'ai déjà défini dans Essayer Block

J'essaie d'écrire un petit bloc de code où je prends une entrée (l'utilisateur peut entrer toute entrée dans des mots ou des lettres), mon code devrait essayer de trouver s'il s'agit d'un nombre positif ou négatif ou la valeur entrée est une chaîne. xxx


3 commentaires

Entrez un numéro: Vingt Traceback (appel le plus récent): Fichier "tryXcept.py", ligne 3, dans str1 = int (entrée ("Entrez un numéro: ')) ValueError: littéral invalide pour INT () avec Base 10: 'Vingt' lors de la manipulation de l'exception ci-dessus, une autre exception s'est produite: Traceback (dernier appel le dernier): Fichier "tryXcept.py", ligne 7, dans str1 = str (str1) nomError: nom 'str1 ' n'est pas défini


Déclarez STR1 avant le bloc d'essai


Mais selon mes connaissances, le code pénètre d'abord dans le bloc d'essai et en cas d'exception / de traçage / erreur, cela va à l'exception de laquelle STR1 est déjà défini?


4 Réponses :


1
votes

La raison est que l'exception est causée dans Int (entrée (...)) afin que la STR1 reste non déclarée.

str1=input('Enter a number:')
try:
    str1=int(str1)
    print('try block is completed')
except:
    str1=str(str1)
if str1>0:
    print('entered value is positive')
elif str1<0:
    print('entered value is negative')
else:
    print(str1)


3 commentaires

Si vous trouvez cette réponse utile, veuillez la marquer comme réponse acceptée, avec la marque de coche à gauche. Merci.


AVIS: Saisie d'une chaîne suivra avec un typeError pour comparer STR à int


Je viens de modifier son code. Cette exception peut être traitée dans le bloc sauf de toute façon.



-2
votes

Dans l'affaire FN Une exception dans l'appel int code>, la variable str1 code> ne peut jamais être créée, car int code> est évalué (et augmente le erreur) avant STR1 code> est attribué.

Aussi - dans le cas d'une exception, vous obtenez un TypeError pour tenter de comparer une chaîne avec 0, alors mettez tout ce que vous avez tout ce que vous supposez la logique à l'intérieur du Essayez CODE>, comme ceci: P>

str1=input('Enter a number:')
try:
    str1=int(str1)
    if str1>0:
        print('entered value is positive')
    elif str1<0:
        print('entered value is negative')
except:
    str1=str(str1)
    print(str1)


5 commentaires

Celui-ci est plus valide, il doit la réponse acceptée.


Je m'attendais à ce que cela jette une erreur comme Ival est une variable locale, mais cela fonctionne bien, pourquoi Rawstr = Entrée ("Entrez un nombre") Essayez: IVAL = INT (RAWSTR) Sauf: IVAL = -1 si IVAL> 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: Imprimer («beau travail») d'autre: imprimer ('pas un nombre »)


Non, le bloc d'essai fait pas établit une portée et des variables créées à l'intérieur d'un bloc d'essai sont disponibles en dehors du bloc. Le problème ici est que l'affectation n'arrive jamais du tout, car il existe une exception tout en évaluant son côté droit.


@ TurePålsson, vous êtes 100% correct. Gopib remarque ma réponse était trompeuse. Vérifiez cet exemple sur: ideone.com/lpehk9


Un bon conseil avec la manipulation des exceptions est le aussi peu possible dans un bloc d'essai, surtout si vous ne spécifiez pas quelles exceptions que vous attrapez.



0
votes

sur votre branche sauf que vous avez l'appel suivant: xxx

puisque vous êtes sur votre sauf, et vous n'avez pas défini votre variable STR1 à l'extérieur de l'essai / à l'exception du bloc, votre déclaration Échec quand il essaie de lancer les contenus de la variable STR1 (qui n'existe pas en dehors de la branche de try)).

Une implémentation possible pour traiter de cette affaire serait de définir STR1 ou une chaîne vide sur votre bloc sauf. Quelque chose comme ceci: xxx


0 commentaires

0
votes

C'est parce que vous utilisez str1 code> dans votre clause sauf. S'il y a une exception lors du traitement de code> entrée code> ou int code>, la variable str1 code> n'est jamais définie. Si vous ajoutez STR1 = Aucun code> avant votre ESSAYER CODE> Déclaration, je suis sûr que cela ne vous plaingera plus, mais vous devez modifier votre sauf code> clause ensuite. Si vous ne vous inquiétez pas de la distribution to int, vous pouvez faire:

str1= None
try:
    str1=input('Enter a number:')
    val=int(str1)
    print('try block is completed')
except:
    val=None

if val is None:
    print('input is not a valid number')
elif val>0:
    print('entered value is positive')
elif val<0:
    print('entered value is negative')
else:
    print(str1)


0 commentaires