janvier
2009
Dans une fonction qui retourne le type yield
, le return
n’indique pas la fin de la fonction. En effet la particularité de yield
est que l’on peut retourner plusieurs valeurs l’une après l’autre.
Alors que se passe-t-il si l’on met le return
à l’intérieur d’un bloc try
?
Par exemple:
yield(int) disUnNombre() { popoh() try: return 5 return 3 return 1 . hopop() }
D’après la documentation, hopop() devrait être appelé juste avant que la fonction retourne avec return 5
. De même pour return 3
et return 1
…
Or le but du bloc try
est d’isoler le code qui peut générer un erreur, de façon que le code qui suit soit toujours exécuté (bloc finally dans d’autres langages). Le yield
interfère ici avec ce but.
Il faut donc ajouter une règle comme quoi l’instruction return
ne cause pas l’exécution du code après le bloc try
dans le cas du yield
. L’exécution a toujours lieu en cas d’exception ou quand les instructions du bloc try
sont complétées.
Le compilateur s’arrange pour que toutes les valeurs de la fonction soient retournées, donc hopop() est appelé dans tous les cas de terminaison.