IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

message d'erreur "except NameError" ne fonctionne pas


Sujet :

Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 14
    Points : 4
    Points
    4
    Par défaut message d'erreur "except NameError" ne fonctionne pas
    Je reviens enquiquiner avec un truc que je ne comprends pas

    j'étudie en ce moment les messages d'erreurs avec "try" et "except"

    mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #! /bin/python
     
    numerateur = input("entrer un numerateur -> ")
    denominateur = input("entrer un denominateur -> ")
     
    try:
    	resultat = numerateur / denominateur
    except NameError:
        print("La variable numerateur ou denominateur n'a pas été définie.")
    except TypeError:
        print("La variable numerateur ou denominateur possède un type incompatible avec la division.")
    except ZeroDivisionError:
        print("La variable denominateur est égale à 0.")
    else:
    	print("resultat = ", numerateur / denominateur)
    le terminal

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    mbp-de-admin:dev_python admin$ python3 ./test_try.py
    entrer un numerateur -> 
    entrer un denominateur -> 
    La variable numerateur ou denominateur possède un type incompatible avec la division.
    mbp-de-admin:dev_python admin$ python3 ./test_try.py
    entrer un numerateur -> k
    entrer un denominateur -> k
    La variable numerateur ou denominateur possède un type incompatible avec la division.
    mbp-de-admin:dev_python admin$
    si je n'entre rien ou si j'entre des lettres, j'obtiens le même message d'erreur. Or, dans le cas où je n'entre aucune valeur, ne devrais je pas avoir un message d'erreur de type "NameError" ?

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 453
    Points : 37 049
    Points
    37 049
    Par défaut
    Salut,

    Une machine ne fait pas ce que vous pensez mais ce pourquoi elle a été construite.
    Le plus simple est de s'amuser avec la console:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> n = d = ''
    >>> n / d
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>rain
    TypeError: unsupported operand type(s) for /: 'str' and 'str'
    >>>
    Pourquoi ne pas afficher le message d'erreur retourné, bien plus explicite que le votre, il vous donne une indication sur le "pourquoi" et diviser une chaîne de caractères vide par une autre n'a effectivement pas trop de sens côté "type".

    - W

  3. #3
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2010
    Messages : 553
    Points : 2 739
    Points
    2 739
    Par défaut
    Salut,

    Citation Envoyé par lamwat Voir le message
    si je n'entre rien ou si j'entre des lettres, j'obtiens le même message d'erreur. Or, dans le cas où je n'entre aucune valeur, ne devrais je pas avoir un message d'erreur de type "NameError" ?
    non car bien que tu n'as rien entré, la variable se voit quand même assigner une "valeur".
    c'est peut être une chaine vide ou un None (ou autre, je sais pas car je n'ai pas Python 3), mais c'est une valeur quand même avec un type défini qui n'est pas compatible avec la division.

    l'exception NameError est levée quand tu cherches à accéder à quelque qui n'existe pas (une variable, une classe, etc...).
    si tu veux voir cette erreur être levée, il suffit de commenter l'une des lignes qui te permet de saisir tes données en mettant un # devant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #numerateur = input("entrer un numerateur -> ")
    si tu lances ton script après ça, l'exception NameError sera levée.

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    En fait, là je voulais surtout pour créer des messages d'erreur dans la suite logique de l'utilisation de la fonction "input"

    du coup, je vais re-court-circuiter le cours pour aller voir les types de données, question con : je peux écrire çà ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    numerateur = int or float(numerateur)
    pour dire que numérateur est soit entier infini ou flottant ?

    merci pour votre temps !

  5. #5
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 302
    Points : 6 782
    Points
    6 782
    Par défaut
    Salut,

    Devant ce genre de question, on ouvre une console et on teste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    >>> n = "1.5"
    >>> x = int or float(n)
    >>> z = float or int(n)
    >>> x
    <type 'int'>
    >>> z
    <type 'float'>
    ... c'est pas gagné.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 453
    Points : 37 049
    Points
    37 049
    Par défaut
    Salut,

    vous pouvez écrire un truc comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    numerateur = int or float(numerateur)
    mais çà ne fera pas ce que vous voulez, i.e. débrouille toi pour fabriquer un int ou un float à partir de ce string.
    Si vous aimez "except", pourquoi ne pas essayer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    >>> def foo(n):
    ...     try:
    ...        n = int(n)
    ...     except ValueError:
    ...        try:
    ...            n = float(n)
    ...        except:
    ...            raise
    ...     except:
    ...        raise
    ...     return n
    ...
    >>> foo('3')
    3
    >>> foo('3.3')
    3.3
    >>> foo('3.3n')
    Traceback (most recent call last):
      File "<stdin>", line 3, in foo
    ValueError: invalid literal for int() with base 10: '3.3n'
    Quelque part c'est un peu horrible mais "s'appliquer" à jouer avec try...except... à toutes les sauces est aussi un moyen d'en apprécier les limites.

    Comme vous allez "diviser", le résultat sera probablement "float" et s'affranchir du choix int ou float pour imposer float en entrée pour un float en sortie "simplifie" un peu les choses.
    - W

Discussions similaires

  1. Message d'erreur - le service d'impression ne fonctionne pas
    Par Louis Griffont dans le forum Windows XP
    Réponses: 1
    Dernier message: 15/02/2009, 15h39
  2. Réponses: 6
    Dernier message: 21/05/2008, 20h16
  3. Messages d'erreurs et exceptions
    Par lolo_momo dans le forum VB.NET
    Réponses: 2
    Dernier message: 16/08/2007, 12h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo