Le suivant est correct:
try
{
Console.WriteLine("Before");
yield return 1;
Console.WriteLine("After");
}
finally
{
Console.WriteLine("Done");
}
L' finally
bloc s'exécute lorsque la chose a fini de s'exécuter (IEnumerator<T>
soutient IDisposable
de fournir un moyen de veiller à ce même lorsque l'énumération est abandonné avant la fin).
Mais ce n'est pas correct:
try
{
Console.WriteLine("Before");
yield return 1; // error CS1626: Cannot yield a value in the body of a try block with a catch clause
Console.WriteLine("After");
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
Supposons que (pour la clarté de l'exposé) qu'une exception est levée par l'une ou l'autre de l' WriteLine
des appels à l'intérieur du bloc try. Quel est le problème avec la poursuite de l'exécution en catch
bloc?
Bien sûr, le rendement de retour de la partie est (pour l'instant) incapable de jeter quoi que ce soit, mais pourquoi devrait-il nous empêcher d'avoir un enfermant try
/catch
pour traiter les exceptions levées avant ou après un yield return
?
Mise à jour: Il y a un intéressant commentaire de Eric Lippert ici - semble qu'ils ont déjà suffisamment de problèmes de mise en œuvre de la try/finally comportement correctement!
EDIT: La page MSDN sur cette erreur est: http://msdn.microsoft.com/en-us/library/cs1x15az.aspx. Il n'explique pas pourquoi, si.