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.

Un article de bredelet