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 :

Repérer les types d'erreurs levées par Python


Sujet :

Python

  1. #1
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut Repérer les types d'erreurs levées par Python
    Voici deux codes avec des erreurs volontaires.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/usr/bin/env python
    #coding=utf-8
     
    if a == 1:
        print 'ok'
    Ceci renvoie tout naturellement le message suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NameError: name 'a' is not defined
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/usr/bin/env python
    #coding=utf-8
     
    A = 'R'
    print A + 2
    Ceci renvoie le message attendu ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TypeError: cannot concatenate 'str' and 'int' objects
    Je cherche, s'il existe, un moyen de récupérer les types d'erreurs repérées par Python, à savoir NameError dans le 1er cas, et TypeError dans le 2nd.

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    On peut récupérer le message d'erreur avec sys.exc_info().

    On obtient un tuple de ce genre:


    (<type 'exceptions.NameError'>, NameError("name 'a' is not defined",), <traceback object at 0x02B015D0>)
    Après, il n'y a plus qu'à couper pour extraire ce qu'on veut. Pour reprendre ton 1er exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    import sys
     
    try:
        if a == 1:
            print "ok"
    except:
        erreur = sys.exc_info()
        typerr = u"%s" % (erreur[0])
        typerr = typerr[typerr.find("'")+1:typerr.rfind("'")]
        print typerr
        msgerr = u"%s" % (erreur[1])
        print msgerr
    Ce qui affiche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    exceptions.NameError
    name 'a' is not defined
    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    http://docs.python.org/reference/dat...html#index-839

    et un exemple dans 8.3 Handling Exceptions
    http://docs.python.org/tutorial/errors.html



    PS
    Luckyrtamos Luke, l'homme qui .......

  4. #4
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Merci tyrtamos, c'est ce que je cherchais. eyquem, peux-tu préciser ta réponse ? Je cherchais à récupérer le type d'erreur levée sans la connaître a priori...

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 206
    Points : 79
    Points
    79
    Par défaut
    Pardonnez-moi de poser cette question, mais quel est l'intérêt d'obtenir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    exceptions.NameError
    name 'a' is not defined
    plutôt que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NameError: name 'a' is not defined

  6. #6
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    C'est pour faire un mode pas à pas de type documentation de listings Python que j'ai besoin de cela, je peux ainsi "imprimer" l'erreur renvoyée par Python.

  7. #7
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    Je cherchais à récupérer le type d'erreur levée sans la connaître a priori...
    C’est bien ce que fait le code de Tyrtamos , non ?




    Je m’étais inspiré de l’exemple en 8.3 pour écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    try:
        if a == 1:
            print "ok"
    except StandardError as u:
        print u
    et j’avais obtenu Namerror et name 'a' is not defined , me semble-t-il.

    Mais maintenant je réessaye et je n’obtiens que name 'a' is not defined
    Je ne comprends pas.




    Je ne sais rien de plus que ce qui se trouve dans les docs.







    scheme, comment obtiens tu NameError: name 'a' is not defined , STP?

  8. #8
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Le message du genre "NameError: name 'a' is not defined" apparait à l'affichage quand l'exception n'est pas gérée et que le programme s'arrête, mais je n'ai pas trouvé d'autre solution que "sys.exc_info()" pour retrouver tous les éléments d'une exception gérée.

    Je signale par contre qu'il est assez pratique d'avoir une fonction qui fait le travail d'extraction à chaque fois que nécessaire. Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    import sys
     
    def recuperreur():
        typerr, msgerr, tback = sys.exc_info()
        typerr = u"%s" % typerr
        typerr = typerr[typerr.rfind(".")+1:typerr.rfind("'")]
        msgerr = u"%s" % msgerr
        return typerr, msgerr
    Après, le code se simplifie à chaque except:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    try:
        if a == 1:
            print "ok"
    except:
        typerr, msgerr = recuperreur()
        print typerr, ":", msgerr
     
    # affichage:
    NameError : name 'a' is not defined
    On peut, bien entendu, utiliser cela aussi avec ses propres exceptions:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    try:
        raise ValueError, "erreur!!!"
    except:
        typerr, msgerr = recuperreur()
        print typerr, ":", msgerr
     
    # affichage:
    ValueError : erreur!!!
    D'ailleurs, c'est pour les messages écrits en français avec des caractères accentués que j'ai fait le traitement de chaine de recuperreur() en unicode.

    Cela marche aussi lorsqu'on crée un nouveau type d'exception perso:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class ErreurDeCalcul(Exception):
        pass
     
    try:
        raise ErreurDeCalcul, "Erreur de calcul !!!"
    except:
        typerr, msgerr = recuperreur()
        print typerr, ":", msgerr
     
    # affichage:
    ErreurDeCalcul : Erreur de calcul !!!
    Et si les bêtises dans la vie réelle pouvaient être récupérées aussi facilement, ce serait bien...

    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 159
    Points : 224
    Points
    224
    Par défaut
    Salut à tous,

    Plutôt que d'utiliser sys.exc_info() (que je ne connaissais pas), j'ai l'habitude d'utiliser 'except' de la manière suivante pour récupérer tous les types d'erreur dérivées de Exception :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Python 2.5.2 (r252:60911, Oct  5 2008, 19:24:49) 
    [GCC 4.3.2] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> try:
    ...     raise ValueError, "argh, une erreur !"
    ... except Exception, e:
    ...     print type(e), ':', e
    ... 
    <type 'exceptions.ValueError'> : argh, une erreur !
    >>>
    edit : apparemment dans python 2.6 que je n'ai pas sous la main on peut écrire

  10. #10
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    @valAa

    Ah, pas mal! ça simplifie un peu.

    Mais on ne gagne pas tout: il reste à convertir type(e) en chaine et à faire l'extraction du nom de l'erreur (pour répondre à la demande de rambc).

    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  11. #11
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Ah, pas mal! ça simplifie un peu.
    Question : cela va-t-il lever tous les types d'erreur possibles ?

    Citation Envoyé par tyrtamos Voir le message
    Mais on ne gagne pas tout: il reste à convertir type(e) en chaine et à faire l'extraction du nom de l'erreur.
    Ce n'est pas le plus méchant à faire.

  12. #12
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Citation Envoyé par rambc Voir le message
    Question : cela va-t-il lever tous les types d'erreur possibles ?
    D'après ce que j'ai compris, "Exception" couvre toutes les exceptions sauf les arrêts volontaires comme Contrôle-C ou SystemExit.

    Mais avec "BaseException", on a tout.

    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  13. #13
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Merci, du coup ce qui suit devrait suffire :
    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
    21
    22
    #!/usr/bin/env python
    #coding=utf-8
     
    # Source : http://www.developpez.net/forums/d818112/autres-langages/python-zope/general-python/reperer-types-derreurs-levees-python/
     
    def prettyType(errorType):
        errorType = str(errorType)
        start = errorType.find('.')
        end = errorType.find("'>")
        return errorType[start+1 : end]
     
     
    try:
        if false:
            if a == 1:
                print "ok"
        else:
            print 'aa' + 4
     
    except BaseException, e:
        print 'Type : ' + prettyType(type(e))
        print 'Message : ', e
    Merci à tous.

  14. #14
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Ou alors tout simplement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    try:
        ...
    except BaseException, e:
        print "Type: " + e.__class__.__name__
    Attention aussi: BaseException n'est disponible que depuis 2.5

  15. #15
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Ok merci pour ces compléments, il manque encore quelques réflexes de base.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. les types de classes supportées par PHP
    Par Y0u35 dans le forum Langage
    Réponses: 5
    Dernier message: 07/07/2011, 13h14
  2. aide SVP concernant les types des erreurs
    Par nagca dans le forum Android
    Réponses: 4
    Dernier message: 22/04/2011, 11h10
  3. Désactiver les pages d'erreur HTML par défaut
    Par Delprog dans le forum Zend
    Réponses: 1
    Dernier message: 13/07/2010, 09h55
  4. Erreur levée par DLookup
    Par el_quincho dans le forum Access
    Réponses: 1
    Dernier message: 21/04/2006, 11h40
  5. [SAX] Comment gerer les erreurs soulevés par sax
    Par tipaquo dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 03/07/2005, 12h00

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