3 votes

Python : clauses try...except...finally dans les générateurs

Code

def gen():
    try:
        for i in range(5):
            yield i
    except Exception as e:
        print('Caught: ' + str(e))
    finally:
        print('I am done')

for x in gen():
    print(x)
    if x == 2:
        raise Exception('Catch me?')

Sortie

0
1
2
I am done
Traceback (most recent call last):
  File "test.py", line 13, in <module>
    raise Exception('Catch me?')
Exception: Catch me?

Question

Pourquoi le code s'exécute-t-il finally mais pas la clause except clause ?

Veuillez donner des explications avec des références.

4voto

BrenBarn Points 63718

Le corps de la fonction du générateur sera seulement exécuté entre itérations de la for boucle. C'est-à-dire que le for boucle signifie quelque chose comme :

  1. Obtenir la valeur suivante du générateur
  2. Corps de la boucle d'exécution
  3. Retourner à l'étape 1

Seule l'étape 1 implique l'exécution effective du code dans la fonction de générateur. Puisque le code à l'intérieur de try dans la fonction de générateur ne soulève pas d'exception, le bloc except La clause n'a rien à attraper. Le site finally s'exécute parce qu'elle s'exécute toujours (c'est ce que la clause finally est pour).

L'utilisation d'une boucle sur un générateur ne signifie pas que le corps entier de la boucle s'exécute "à l'intérieur" de la fonction du générateur. Cela signifie simplement qu'une valeur à la fois est extraite du générateur jusqu'à ce qu'il soit épuisé. Le corps de la boucle s'exécute toujours dans sa propre portée, distincte de celle de la fonction du générateur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X