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 :

Try,Except explication ?


Sujet :

Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2021
    Messages : 3
    Points : 0
    Points
    0
    Par défaut Try,Except explication ?
    Bonjour le forum

    Une âme charitable pour m'expliquer de manière simple l'utilité d'un "Try" ou "Except" en langage python, pourquoi l'utilise t-on? j'ai bien tenté des recherches mais tous en anglais et ça reste un peu (beaucoup?) flou... un petit exemple que j'ai pu voir .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    #Example
    #The try block will generate an exception, because x is not defined:
     
    try:
      print(x)
    except:
      print("An exception occurred")
    Ou encore un autre exemple ici

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    try:
      print(x)
    except NameError:
      print("Variable x is not defined")
    except:
      print("Something else went wrong")

    D'après ce que j'ai pu comprendre (j'expliquerai surement mal) le "Try" est une "tentative" si celle ci échoue alors c'est là qu'interviendra "Except" on implémente des exceptions dans le code afin d'éviter que celui-ci crash?

    Merci pour vos explications

  2. #2
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    en gros le mécanisme try/except répond à la maxime selon laquelle "il vaut mieux demander pardon que demander la permission".
    si par exemple on veut ouvrir un fichier, on essaye (try) de l'ouvrir directement, et s'il n'existe pas on s'excuse gentiment auprès de l'OS.
    tandis que si au lieu de ça on vérifiait au préalable si le fichier existe (if -> open) on pourrait éventuellement se retrouver dans un cas où le fichier existe au moment de la vérification et n'existe plus au moment de l'ouvrir.
    c'est le cas d'application typique d'une attaque TOCTOU (Time Of Check, Time Of Use), et -très- accessoirement dans le cas où le try réussit ça fait moins de code à exécuter, le codepath est plus direct.

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par Hasmodan Voir le message
    Une âme charitable pour m'expliquer de manière simple l'utilité d'un "Try" ou "Except" en langage python, pourquoi l'utilise t-on?
    Prenez une foncton comme int qui transforment une chaine de caractères en nombre entier/flottant. On va écrire n = int('123') et dans ce cas on se retrouve avec l'entier 123 associé à la variable n.

    Maintenant, imaginons que je me plante et écrive n = int('123X').
    Quelle sera la façon la plus simple pour que "int" signale qu'il ne peut pas faire le boulot que je lui demande? Générer une exception.

    Avant l'utilisation des exceptions, permette à int de signaler qu'il ne peut pas faire le boulot avec ce qu'on lui a passé se faisait via 2 variables: une retournant un status d'erreur et une autre le résultat qui ne pouvait être utilisé qu'après avoir testé que l'opération s'était bien passée.

    Souvent le programmeur indélicat oublie de tester le status... et on se retrouve avec des erreurs incompréhensibles qui se manifestent bien plus tard (lorsqu'on utilise le résultat qui sans être valide peut rester utilisable...).

    Avec le mécanisme d'exception, soit le programme s'arrête (c'est mieux que de faire n'importe quoi) soit le programmeur a prévu que faire dans ce cas là (ce qui se traduit par la construction try...except...).

    Le reste est dans les tutos.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2021
    Messages : 3
    Points : 0
    Points
    0
    Par défaut
    Merci pour les réponses

    Je vais illustré avec mes propres mots/schéma

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    a = 0
    b = 278
    try:
        b/a
        print("Good Job")
    except:
        print("ERREUR!!! en mathématique la division par 0 est impossible =D ")
    Ici un exemple basique mais qui est pour moi très parlant, je tente de faire une division par "0" qui mathématiquement est pas possible (enfin je crois ) donc comme c'est "impossible" je rentre dans le cas "D'except" et il me retourne une erreur car c'est pas possible de faire la division.


    Cependant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    a = 40
    b = 278
    try:
        b/a
        print("Good Job")
    except:
        print("ERREUR!!! en mathématique la division par 0 est impossible =D ")
    Le résultat sera "Good Job" car l'opération est possible, donc la "condition" "Try" est respecté

    Suis-je bon?

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par Hasmodan Voir le message
    donc comme c'est "impossible" je rentre dans le cas "D'except" et il me retourne une erreur car c'est pas possible de faire la division.
    "retourner une erreur" et "lever une exception" ont un sens différent.
    Imaginez la fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def f(a, b):
         return b / a
    Elle retourne le résultat de la division de b par a (et çà génère une exception si a est 0)

    Maintenant, imaginons utiliser f dans une fonction g:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def g(b):
         for a in range(3, -1, -1):
              print (f(a, b))
    g ne retourne rien, elle se contente d'afficher ce que retourne f.

    Enfin on appelle g... et bien sur çà plante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >>> g(5)
    1.6666666666666667
    2.5
    5.0
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 3, in g
      File "<stdin>", line 2, in f
    ZeroDivisionError: division by zero
    >>>
    La question est où mettre un try...except: dans f? dans g? encore plus haut?
    Sachant que le try...except... me permet d'attraper l'exception et que la gérer signifie la masquer pour l'appelant (sinon çà veut dire quoi "je gère"?).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Hasmodan Voir le message
    Le résultat sera "Good Job" car l'opération est possible, donc la "condition" "Try" est respecté

    Suis-je bon?
    Ok mais attention aux termes. "try" ce n'est pas une condition, c'est un "essai".
    Et généralement on préfère affiner le cas d'echec plutôt que de mettre un "except" général. Dans ce cas, l'exception sera "ZeroDivisionError". Et enfin l'exception retournant un objet, il peut être utile de récupérer cet objet pour (par exemple) l'afficher
    Donc le tout pourrait s'écrire

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    a = 0
    b = 278
    try:
        b/a
        print("Good Job")
    except ZeroDivisionError as e:
        print("ERREUR!!! en mathématique la division par 0 est impossible (%s)" % e)

    Citation Envoyé par BufferBob Voir le message
    ...et s'il n'existe pas on s'excuse gentiment auprès de l'OS.
    Non, c'est plutôt "...et s'il n'existe pas l'OS râle mais je m'en bats le steak". Mais j'aime bien ta façon de voir les choses
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. try except qu'on m'explique
    Par pierrot67 dans le forum Bases de données
    Réponses: 2
    Dernier message: 12/04/2006, 10h52
  2. Problème avec Try ... Except
    Par Kcintim dans le forum Langage
    Réponses: 1
    Dernier message: 25/03/2006, 15h31
  3. "try...except" sans message d'erreur
    Par SchpatziBreizh dans le forum Langage
    Réponses: 4
    Dernier message: 12/07/2005, 09h50
  4. [try except keyerror] récupérer le nom de la variable
    Par jean-jacques varvenne dans le forum Général Python
    Réponses: 2
    Dernier message: 03/03/2005, 16h59
  5. bloc try/except et API windows
    Par jakouz dans le forum API, COM et SDKs
    Réponses: 5
    Dernier message: 24/02/2005, 12h21

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