Va bene quanto segue:
try
{
Console.WriteLine("Before");
yield return 1;
Console.WriteLine("After");
}
finally
{
Console.WriteLine("Done");
}
Il finally
blocco viene eseguito quando l'intera operazione è terminata ( IEnumerator<T>
supporta IDisposable
per fornire un modo per garantire ciò anche quando l'enumerazione viene abbandonata prima che termini).
Ma questo non va bene:
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);
}
Supponiamo (per amor di discussione) che un'eccezione venga lanciata da una o dall'altra delle WriteLine
chiamate all'interno del blocco try. Qual è il problema se si continua l'esecuzione in catch
blocco?
Ovviamente, la parte yield return non è (attualmente) in grado di lanciare nulla, ma perché questo dovrebbe impedirci di avere un allegato try
/ catch
per gestire le eccezioni lanciate prima o dopo a yield return
?
Aggiornamento: c'è un commento interessante di Eric Lippert qui - sembra che abbiano già abbastanza problemi nell'implementare correttamente il comportamento try / latest!
EDIT: la pagina MSDN su questo errore è: http://msdn.microsoft.com/en-us/library/cs1x15az.aspx . Tuttavia, non spiega perché.