Lo siguiente está bien:
try
{
Console.WriteLine("Before");
yield return 1;
Console.WriteLine("After");
}
finally
{
Console.WriteLine("Done");
}
El finally
bloque se ejecuta cuando todo ha terminado de ejecutarse ( IEnumerator<T>
admite IDisposable
proporcionar una forma de garantizar esto incluso cuando la enumeración se abandona antes de que finalice).
Pero esto no está bien:
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);
}
Supongamos (por el bien del argumento) que una u otra de las WriteLine
llamadas dentro del bloque try lanza una excepción . ¿Cuál es el problema de continuar la ejecución en catch
bloque?
Por supuesto, la parte de retorno de rendimiento (actualmente) no puede arrojar nada, pero ¿por qué eso debería evitar que tengamos un cierre try
/ catch
para lidiar con las excepciones lanzadas antes o después de un yield return
?
Actualización: Hay un comentario interesante de Eric Lippert aquí : ¡parece que ya tienen suficientes problemas para implementar correctamente el comportamiento de prueba / finalmente!
EDITAR: La página de MSDN en este error es: http://msdn.microsoft.com/en-us/library/cs1x15az.aspx . Sin embargo, no explica por qué.