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 :

gestion des erreur et exception avec try except : comment gérer deux types?


Sujet :

Python

  1. #1
    Membre averti
    Femme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2022
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juin 2022
    Messages : 36
    Par défaut gestion des erreur et exception avec try except : comment gérer deux types?
    Bonjour
    je découvre la gestion des erreur et exception avec try except.

    comment faire pour gérer plusieurs erreurs qui peuvent survenir dans un try?

    par exemple
    j'ai le cas simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while True:
        try:
            x = int(input("saisir un nb : "))
            break # permet de sortir de la boucle while si aucnue erreur n'est générée
        except:
            print("ce n'est pas un nb...")
    ce code genèrre une xception dès qu'il y a une erreur (quel que soit le type), ici je comprends que ce sera forcément le type valueError



    j'ai cet autre cas simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    try:
        x = int(input("saisir un nb: "))
        result = 10/x
        print (result)
     
    except ZeroDivisionError:
        print("probleme de division")
    si on entre un nombre différent de 0: OK
    si on entre 0, on génère l'erreur ZeroDivisionError qui correspond à l'exception, on entre dans l'except
    si on entre autre chose qqu'un chiffre, on génère une erreur qui n'est psa ZeroDivisionError (valueError), donc on n'entre pas dans l'except

    maintenant si je veux gérer deux erreur : valueError et ZeroDivisionError
    comment je fais pour préciser ces deux types dans exception?

    merci

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 814
    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 814
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par sqlbeginner Voir le message
    maintenant si je veux gérer deux erreur : valueError et ZeroDivisionError
    comment je fais pour préciser ces deux types dans exception?
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    try:
    	x = int(input("saisir un nb: "))
    	result = 10/x
    	print (result)
    except ZeroDivisionError:
    	print("probleme de division par zéro")
    except ValueDivisionError:
    	print("probleme de valeur")

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    try:
    	x = int(input("saisir un nb: "))
    	result = 10/x
    	print (result)
    except (ZeroDivisionError, ValueError):
    	print("probleme de division par zéro ou de valeur")

    Mais généralement deux actions distinctes se gèrent de façon distincte...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    try:
    	x = int(input("saisir un nb: "))
    except ValueDivisionError:
    	print("probleme de valeur")
    else:
    	try:
    		result = 10/x
    	except ZeroDivisionError:
    		print("probleme de division par zéro")
    	else:
    		print (result)

    Après, si on peut éviter le try (plus gourmand)...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    try:
    	x = int(input("saisir un nb: "))
    except ValueDivisionError:
    	print("probleme de valeur")
    else:
    	if x != 0:
    		result = 10/x
    		print (result)
    	else:
    		print("probleme de division par zéro")
    ... mais avant d'envisager ce dernier cas faut réfléchir au danger du TOCTOU bug...
    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]

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 696
    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 696
    Par défaut
    Salut,

    Citation Envoyé par sqlbeginner Voir le message
    maintenant si je veux gérer deux erreur : valueError et ZeroDivisionError
    comment je fais pour préciser ces deux types dans exception?
    Pour info, il y a un chapitre entier sur ce sujet dans le tutoriel livré avec le langage Python.

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

  4. #4
    Membre averti
    Femme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2022
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juin 2022
    Messages : 36
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour


    Après, si on peut éviter le try (plus gourmand)...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    try:
    	x = int(input("saisir un nb: "))
    except ValueDivisionError:
    	print("probleme de valeur")
    else:
    	if x != 0:
    		result = 10/x
    		print (result)
    	else:
    		print("probleme de division par zéro")
    ... mais avant d'envisager ce dernier cas faut réfléchir au danger du TOCTOU bug...
    le try n'est pas une bonne pratique?
    il faut le limiter dans un script python?

  5. #5
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 933
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 933
    Par défaut
    Citation Envoyé par sqlbeginner Voir le message
    le try n'est pas une bonne pratique?
    il faut le limiter dans un script python?
    Ce n'est pas ce qu'à dit Sve@r.
    Il a dit qu'il fallait faire attention à ne pas créer un bug de type Time-of-check to time-of-use (ou TOCTOU) dans la structure qu'il a montré.


    Après les puriste me corrigeront si je dis une bêtise mais AMHA, une exception doit être être, comme son nom l'indique, exceptionnelle.
    Ceci car un code placé dans un bloc try sera plus long à exécuter

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 696
    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 696
    Par défaut
    Citation Envoyé par popo Voir le message
    près les puriste me corrigeront si je dis une bêtise mais AMHA, une exception doit être être, comme son nom l'indique, exceptionnelle.
    Ceci car un code placé dans un bloc try sera plus long à exécuter
    Je dirais çà autrement: un bloc try...except ne sera pas plus lent/long à exécuter tant qu'il n'y a pas d'exception à traiter <=> l'exception doit être exceptionnelle.... mais c'est une fonctionnalité récente:
    Citation Envoyé par 3.11 release notes
    “Zero-cost” exceptions are implemented, eliminating the cost of try statements when no exception is raised. (Contributed by Mark Shannon in bpo-40222.)
    avant 3.11 (que je n'ai pas testé) ça coute quand même un peu.

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

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 814
    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 814
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par sqlbeginner Voir le message
    le try n'est pas une bonne pratique?
    Voilà, deux autres intervenants de talents ont répondu. Je vais rajouter ma propre réponse: ce n'est pas une bonne pratique quand on peut (sans risque) faire autrement.
    Dit autrement: si tu ne maîtrises pas ton environnement et ce qui s'y passe (une saisie comme tu l'as fait, ou l'accès à un fichier qui peut disparaitre, ou autre), alors try/except (je tente et je gère si ça n'a pas pu se faire). Mais utiliser try/except pour évaluer une situation que tu maîtrises et qui ne changera pas entre temps (ici une variable qui peut valoir zéro) c'est non. Ce n'est pas interdit mais les autres solutions sont plus rapides.
    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]

  8. #8
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 306
    Par défaut
    bonjour

    C'est une très bonne pratique, mais il faut savoir quand/comment l'utiliser.

    On a tous commencé avec ton exemple mais il n'est pas représentatif de la puissance des exceptions.

    première chose : On n'est pas obligé de lever une exception immédiatement comme ton exemple (ici, un if peut parfois être aussi efficace)
    une exception va être transmise au code en amont et ici, cela peut être très utile.

    puisque ton peuso est SQL...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    try:
        sql_sauvegarde_tout_transaction(x,y,z)  # ma fonction complexe qui elle, ne lève aucune exception
    except SqlException:
        rollback()
    Une exception n'est pas obligatoirement une erreur, parfois, on peut utiliser ce système pour donner des infos en amont (dans le code).
    Il ne faut pas oublier que l'on peut aussi lancer des exceptions ! Et, en plus, nous pouvons créer nos propres Exceptions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if len(sys.argv) <1: raise valueError("Il faut au moins passer un paramètre")
    # Créer une exception "ExceptionMoinsDe18Ans"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    try:
        datas = saisie_utilisateur()   # exception créée dans une "sous" fonction de celle ci
    except ExceptionMoinsDe18Ans:
        print("Attention, il faut en plus  ....")
        faire_une_chose_particulière(datas)
    # peut-être plus simple que de créer 36 "if datas.age <18" dans notre application (pour une, NON)
    Même chose, avec la création de nos propres exceptions Alerte...Critique (exemple trop basique ici pour être forcément pertinent, mais donne bien l'idée)
    Reste à voir si c'est bien à prendre_des_mesures() ou une de ces sous-fonctions de déterminer ce qui est une Alerte ou une erreur ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    try:
         datas = prendre_des_mesures()
    except TemperatureWarm as alerte:
        log(temp, alerte)
    except TemperatureCritique:
        raise

    ------------

    Plus proche de la question originelle, depuis python 3.11 nous avons en plus la pep 654 : pas pour intercepter, mais pour déclencher un groupe d'exceptions.

Discussions similaires

  1. [Python 3.X] Gestion des erreurs et exceptions
    Par Talsaj dans le forum Général Python
    Réponses: 5
    Dernier message: 23/06/2018, 16h50
  2. Gestion des erreurs de parsing avec PLY
    Par dimele dans le forum Général Python
    Réponses: 6
    Dernier message: 29/07/2014, 10h01
  3. [PHP 5.3] Gestion des erreurs et exceptions et MVC
    Par RunCodePhp dans le forum Langage
    Réponses: 4
    Dernier message: 28/01/2011, 11h42

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