Question Python try-else


Quelle est l'utilisation prévue de l'option else clause du try déclaration?


425
2018-05-13 02:15


origine


Réponses:


Les déclarations dans le else bloc sont exécutés si l'exécution tombe au bas de la try - s'il n'y avait pas d'exception. Honnêtement, je n'ai jamais trouvé de besoin.

cependant, Gestion des exceptions Remarques:

L'utilisation de la clause else est meilleure   que d'ajouter du code supplémentaire à l'essai   clause parce qu'elle évite accidentellement   attraper une exception qui n'était pas   soulevé par le code étant protégé par   le try ... sauf déclaration.

Donc, si vous avez une méthode qui pourrait, par exemple, lancer un IOError, et vous voulez attraper les exceptions qu'il soulève, mais il y a autre chose que vous voulez faire si la première opération réussit, et vous ne pas vouloir attraper une erreur IOError de cette opération, vous pourriez écrire quelque chose comme ceci:

    try:
        operation_that_can_throw_ioerror()
    except IOError:
        handle_the_exception_somehow()
    else:
         # we don't want to catch the IOError if it's raised
        another_operation_that_can_throw_ioerror()
    finally:
        something_we_always_need_to_do()

Si vous venez de mettre another_operation_that_can_throw_ioerror() après operation_that_can_throw_ioerror, la except attraperait les erreurs du second appel. Et si vous le mettez après le tout try bloc, il sera toujours exécuté, et pas avant le finally. le else vous permet de vous assurer

  1. l'exécution de la deuxième opération seulement s'il n'y a pas d'exception,
  2. il est exécuté avant le finally bloquer, et
  3. tout IOErrors il soulève ne sont pas pris ici

686
2018-05-13 02:18



Il existe une gros raison d'utiliser else - style et lisibilité. Il est généralement recommandé de conserver un code susceptible de provoquer des exceptions à proximité du code qui les concerne. Par exemple, comparez-les:

try:
    from EasyDialogs import AskPassword
    # 20 other lines
    getpass = AskPassword
except ImportError:
    getpass = default_getpass

et

try:
    from EasyDialogs import AskPassword
except ImportError:
    getpass = default_getpass
else:
    # 20 other lines
    getpass = AskPassword

Le second est bon quand le except ne peut pas revenir tôt, ou relancer l'exception. Si possible, j'aurais écrit:

try:
    from EasyDialogs import AskPassword
except ImportError:
    getpass = default_getpass
    return False  # or throw Exception('something more descriptive')

# 20 other lines
getpass = AskPassword

Remarque: Réponse copiée d'un doublon récemment publié ici, d'où tous ces trucs "AskPassword".


79
2018-01-29 19:13



Une utilisation: tester du code qui devrait déclencher une exception.

try:
    this_should_raise_TypeError()
except TypeError:
    pass
except:
    assert False, "Raised the wrong exception type"
else:
    assert False, "Didn't raise any exception"

(Ce code devrait être extrait dans un test plus générique dans la pratique.)


40
2018-05-13 02:36



Python try-else

Quelle est l'utilisation prévue de l'option else clause de la déclaration try?

Résumé

le else déclaration s'exécute s'il y a non exceptions et si elle n'est pas interrompue par un return, continue, ou break déclaration.

Les autres réponses manquent cette dernière partie.

De la docs:

L'option else la clause est exécutée si et quand le contrôle s'écoule du   fin du try clause.*

(Bolding ajouté.) Et la note se lit comme suit:

* Actuellement, le contrôle "découle" sauf dans le cas d'un   exception ou l'exécution d'un return, continue, ou break déclaration.

Il nécessite au moins une clause except (voir la grammaire). Donc ce n'est vraiment pas "try-else", c'est "try-except-else (-finally)", avec le else (et finally) être facultatif.

le Didacticiel Python élabore sur l'utilisation prévue:

L'instruction try ... except a une clause else facultative, qui, lorsque   présent, doit suivre toutes sauf les clauses. C'est utile pour le code   doit être exécuté si la clause try ne déclenche pas d'exception. Pour   Exemple:

for arg in sys.argv[1:]:
    try:
        f = open(arg, 'r')
    except IOError:
        print 'cannot open', arg
    else:
        print arg, 'has', len(f.readlines()), 'lines'
        f.close()

L'utilisation de la clause else est préférable à l'ajout de code supplémentaire à   la clause try car elle évite de prendre accidentellement une exception   cela n'a pas été soulevé par le code étant protégé par l'essai ... sauf   déclaration.

Exemple de différenciation else par rapport au code suivant la try bloc

Si vous gérez une erreur, le else le bloc ne fonctionnera pas. Par exemple:

def handle_error():
    try:
        raise RuntimeError('oops!')
    except RuntimeError as error:
        print('handled a RuntimeError, no big deal.')
    else:
        print('if this prints, we had no error!') # won't print!
    print('And now we have left the try block!')  # will print!

Et maintenant,

>>> handle_error()
handled a RuntimeError, no big deal.
And now we have left the try block!

23
2018-02-10 23:31



Je trouve cela vraiment utile lorsque vous devez faire le nettoyage, même s'il y a une exception:

try:
    data = something_that_can_go_wrong()
except Exception as e: # yes, I know that's a bad way to do it...
    handle_exception(e)
else:
    do_stuff(data)
finally:
    clean_up()

12
2018-05-13 02:34



Même si vous ne pouvez pas penser à l’utiliser tout de suite, vous pouvez parier qu’il doit y avoir une utilisation. Voici un échantillon sans imagination:

Avec else:

a = [1,2,3]
try:
    something = a[2]
except:
    print "out of bounds"
else:
    print something

Sans pour autant else:

try:
    something = a[2]
except:
    print "out of bounds"

if "something" in locals():
    print something

Ici vous avez la variable something défini si aucune erreur n'est générée. Vous pouvez supprimer ceci en dehors du try bloquer, mais cela nécessite une détection désordonnée si une variable est définie.


11
2018-05-13 02:26



De Erreurs et exceptions # Gestion des exceptions - docs.python.org

le try ... except déclaration a un optionnel else clause, qui,   lorsqu'il est présent, doit suivre toutes les clauses sauf. C'est utile pour le code   cela doit être exécuté si la clause try ne déclenche pas d'exception.   Par exemple:

for arg in sys.argv[1:]:
    try:
        f = open(arg, 'r')
    except IOError:
        print 'cannot open', arg
    else:
        print arg, 'has', len(f.readlines()), 'lines'
        f.close()

L'utilisation de la clause else est préférable à l'ajout de code supplémentaire à   la clause try car elle évite de prendre accidentellement une exception   cela n'a pas été soulevé par le code étant protégé par l'essai ... sauf   déclaration.


7
2017-08-21 12:29



Il y a un bel exemple de try-else dans PEP 380. En gros, cela revient à faire différentes manipulations d’exceptions dans différentes parties de l’algorithme.

C'est quelque chose comme ça:

try:
    do_init_stuff()
except:
    handle_init_suff_execption()
else:
    try:
        do_middle_stuff()
    except:
        handle_middle_stuff_exception()

Cela vous permet d'écrire le code de gestion des exceptions plus près de l'endroit où l'exception se produit.


5
2018-05-27 11:39



Essayez-except-else est génial pour combiner le modèle EAFP avec dactylographie:

try:
  cs = x.cleanupSet
except AttributeError:
  pass
else:
  for v in cs:
    v.cleanup()

Vous pourriez penser que ce code naïf est bien:

try:
  for v in x.cleanupSet:
    v.clenaup()
except AttributeError:
  pass

C'est un excellent moyen de cacher accidentellement de graves bogues dans votre code. J'ai tapé le nettoyage là-bas, mais l'attribut AttributeError qui me ferait savoir est en train d'être avalé. Pire encore, que se passe-t-il si je l'ai écrit correctement, mais que la méthode de nettoyage passe parfois un type d'utilisateur avec un attribut mal nommé, provoquant un échec silencieux à mi-chemin et un fichier non fermé? Bonne chance pour déboguer celui-là.


5
2018-04-17 22:11



Regarder Référence Python Il paraît que else est exécuté après try quand il n'y a pas d'exception. La clause else facultative est exécutée si et quand le contrôle est exclu de la clause try. 2 Les exceptions dans la clause else ne sont pas gérées par les clauses except précédentes.

Plongez en python a un exemple où, si je comprends bien, dans try bloquer ils essaient d'importer un module, quand cela échoue, vous obtenez une exception et une liaison par défaut, mais quand cela fonctionne, vous avez la possibilité d'aller dans else bloquer et lier ce qui est requis (voir le lien pour l'exemple et l'explication).

Si vous avez essayé de travailler dans catch bloquer, il pourrait jeter une autre exception - je suppose que c'est là le else bloc vient à portée de main.


3
2018-05-13 02:20



C'est tout. Le bloc 'else' d'une clause try-except existe pour le code qui s'exécute lorsque (et uniquement lorsque) l'opération réussie réussit. Il peut être utilisé, et il peut être abusé.

try:
    fp= open("configuration_file", "rb")
except EnvironmentError:
    confdata= '' # it's ok if the file can't be opened
else:
    confdata= fp.read()
    fp.close()

# your code continues here
# working with (possibly empty) confdata

Personnellement, je l'aime et l'utilise quand c'est approprié. Il groupe sémantiquement les déclarations.


2
2018-05-14 20:43