Ce qui suit est correct:
try
{
Console.WriteLine("Before");
yield return 1;
Console.WriteLine("After");
}
finally
{
Console.WriteLine("Done");
}
Le finally
bloc s'exécute lorsque le tout a fini de s'exécuter ( IEnumerator<T>
prend IDisposable
en charge pour fournir un moyen de garantir cela même lorsque l'énumération est abandonnée 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 (pour des raisons d'argumentation) qu'une exception soit levée par l'un ou l'autre des WriteLine
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, la partie yield return est (actuellement) incapable de lancer quoi que ce soit, mais pourquoi cela devrait-il nous empêcher d'avoir une clôture try
/ catch
traiter les exceptions levées avant ou après un yield return
?
Mise à jour: Il y a un commentaire intéressant d'Eric Lippert ici - il semble qu'ils aient déjà suffisamment de problèmes pour implémenter correctement le comportement try / finally!
EDIT: La page MSDN sur cette erreur est: http://msdn.microsoft.com/en-us/library/cs1x15az.aspx . Cela n'explique cependant pas pourquoi.