[python] empecher une erreur de couper un programme
Répondre à la discussion
Affichage des résultats 1 à 9 sur 9

[python] empecher une erreur de couper un programme



  1. #1
    Loupsio

    [python] empecher une erreur de couper un programme


    ------

    Bonjour,

    J'ai un élément dans un script qui me renvoi une erreur lors d'une coupure wifi (puisque le script va sur internet) et ducoup le programme s'arrête
    pour cela je pensais faire une vérification avant qu'il aille recupérer les données, du genre
    Code:
    if type == HTTPResponse:
         faire ce qu'il a a faire
    else: print('erreur reseau")
    pour éviter de passer par la ligne qui provoque l'erreur et arrete le script
    et comme ca, lorsque'il retrouve internet, il peut reprendre

    sauf que déjà dans le "if" si il n'y a pas accès a internet, le programme s'arrête


    le type de ce que je cherche est : <class 'http.client.HTTPResponse'>
    et vu que contrairement aux types str ou int, pour lesquels isinstance() marche très bien, je n'ai pas reussi a utiliser isinstance pour le type http.client.HTTPResponse
    j'ai opté dans le if pour un
    Code:
    if (str(opener.open("http://xxxxxxxx"))[1]=='h'):
       print("ok")
    else: print('no')

    lorsque je suis en wifi, pas de probleme il ecrit bien "ok" (je compare à la lettre 'h' car str(opener.open()) me renvoi "http....." et donc avec en premiere position le 'h', qui ne devrait pas être la lorsqu'on coupe internet puisque le type ne sera plus "http...")
    si par contre je coupe le wifi, au lieu d'écrir 'no' il me ressort l'erreur d'accès internet et coupe le programme,

    j''aimerai donc pouvoir vérifier s'il arrive a atteindre le site, sans qu'il me renvoi d'erreur si jamais il n'y arrive pas

    -----

  2. #2
    Ikhar84
    Animateur Informatique

    Re : [python] empecher une erreur de couper un programme

    Salut !
    Comme dit dans plusieurs post précédents, je ne maîtrise vraiment (mais vraiment) pas python !

    Mais,...

    Une rapide recherche sur la gestion des exceptions par python, me confirme que python gère ça très bien, via le couple
    Code:
       try:
           ....
       except Nom_de_l_exception
           ....
    Comme dans la plupart des langages qui vont bien... avec le couple try/catch....

    Le bloc try est protégé
    Et le bloc except est executé lorsque "l'erreur" se produit... pour ne pas réagir à l'erreur, il suffit de laisser ce bloc vide, ou, mieux, de gerer un système de log...
    J'ai glissé Chef !

  3. #3
    Loupsio

    Re : [python] empecher une erreur de couper un programme

    Merci,
    je connais les bases de python mais sans plus, je ne connais pas d'autres gros langages et je ne suis absolument pas dans le domaine (petits programmes a mes heures perdus, sans plus)
    Je ne connaissait pas du tout le principe des exceptions et "try" fonctionne parfaitement
    Merci beaucoup

  4. #4
    pm42

    Re : [python] empecher une erreur de couper un programme

    C'est bien de la connaitre parce que c'est une technique de gestion des erreurs qui est présente dans de nombreux langages modernes.

  5. A voir en vidéo sur Futura
  6. #5
    polo974

    Re : [python] empecher une erreur de couper un programme

    ATTENTION ! ! !
    il ne faut pas vouloir faire simplement un exit() dans un bloc try: car le exit() déclenche une exception et elle sera capturée...

    bon, on peut ajouter un except plus sophistiqué (mais faut pas l'oublier...) genre:
    Code:
    ...
    try: 
        poly = sys.argv.index("poly") 
        print "poly pas encore implémenté..." 
        exit(2) # exit "foireux..."
    except SystemExit as ex: 
        print "après exit(%r) " % ex.args[0] 
        raise 
    except: 
        print "except..." 
        poly = 0 
    ...
    bref, le try: c'est bien mais le except: pass, c'est très mal...
    Jusqu'ici tout va bien...

  7. #6
    CM63

    Re : [python] empecher une erreur de couper un programme

    Bonjour,

    Oui, j'ajouterais qu'il ne faut utiliser les exceptions que si on ne peut pas faire autrement. En l’occurrence on peut s'en passer en commençant par tester le résultat de opener.open : vérifier qu'il renvoie quelque chose avant de traiter l'information.

  8. #7
    Loupsio

    Re : [python] empecher une erreur de couper un programme

    C'est ce que j'essayais de faire avec le "if" (car isinstance() ne marchait pas avec ce type), mais il me renvoyait quand meme l'erreur lorsque la machine n'était pas sur internet ,
    l'utilisation de try est parfaite, quand ca tourne, ca tourne, et quand il n'y a plus internet l'erreur est contournée et le programme continue de tourner en affichant à l'écran qu'il y a un problème de connexion, jusqu'a ce qu'il retrouve le réseau et reprenne ses fonctions normales
    s'il y a une "meilleur" méthode et qu'elle marche, je suis preneur, mais le principal pour moi (non professionel, et pour une utilisation du programme en cercle restreint) c'est que ca marche comme souhaité, quitte à ce que ca ne soit pas "optimal" pour un vrai programmeur (mais je reste ouvert à une meilleur façon de faire)

    Merci à vous
    Dernière modification par Loupsio ; 08/12/2017 à 10h51.

  9. #8
    Ikhar84
    Animateur Informatique

    Re : [python] empecher une erreur de couper un programme

    Non on est bien dans le cas "optimal" (si on peut dire) de la gestion des erreurs par les exceptions, ce que voulait dire CM63 (je pense) c'est qu'il ne fallait pas se laisser à la simplicité apparente des exceptions et délégué son travail de conception au try...

    Dans certains cas c'est parfaitement indiqué (il faut en général "imbriquer" les captures des exceptions, même sible mot me semble inadapté ici, afin de gerer proprement chaque cas qui se présente), mais dans d'autres cas, de simples test (à base de if...) suffisent à gerer correctement les cas qui posent problèmes, sans faire appel à un mécanisme qui reste quand même lourd, face au if...

    Quand le test lui même risque de generer une exception, cas ici, il n'y a pas beaucoup d'autres choix que de capturer les erreurs et agir en consequence...

    Ce qui est important, c'est de bien concevoir en amont, et maitriser son code, par opposition à poser des rustines lorsque des cas dits limites se présente, pour cela, rien de mieux que bien lire la doc des fonctions appellées...

    Je pense que CM63 sera d'accord, même si j'ai bien conscience que c'est pas optimisée comme réponse (entre 2 pauses clope au boulot )

    Edit: je parle bien sûr de généralité, pas pro de python et ne connaissant pas la fonction invoquée ici...
    Dernière modification par Ikhar84 ; 08/12/2017 à 12h35.
    J'ai glissé Chef !

  10. #9
    pm42

    Re : [python] empecher une erreur de couper un programme

    Cela dépend aussi du style de programmation, du langage...
    Par exemple en Java, une exception peut coûter cher en temps. Donc elle doit rester ce que son nom indique : une exception. Et ne pas être utilisée comme un outil de contrôle de flux équivalent aux boucles, if, appels de fonctions...

    Si on programme en fonctionnel, elle casse ce qu'on appelle la transparence référentielle et on utilise des méthodes différentes pour gérer les erreur : typiquement le retour de structures monadiques ou équivalentes (Option, Either, Try...).

Discussions similaires

  1. Programme Python
    Par coockie13 dans le forum Programmation et langages, Algorithmique
    Réponses: 2
    Dernier message: 29/01/2017, 07h50
  2. [Python] subprocess, lancer un autre programme avec python
    Par Loupsio dans le forum Programmation et langages, Algorithmique
    Réponses: 10
    Dernier message: 30/11/2016, 18h56
  3. Programme en python
    Par Isis-mirka dans le forum Programmation et langages, Algorithmique
    Réponses: 16
    Dernier message: 01/12/2014, 21h29
  4. Programme python
    Par THESO dans le forum Programmation et langages, Algorithmique
    Réponses: 5
    Dernier message: 20/09/2013, 21h52
  5. Programme en Python
    Par invitec13ffb79 dans le forum Logiciel - Software - Open Source
    Réponses: 7
    Dernier message: 19/09/2011, 19h14