El siguiente es aceptable:¿Por qué no puede arrojar retorno aparecer dentro de un bloque de prueba con un truco?
try
{
Console.WriteLine("Before");
yield return 1;
Console.WriteLine("After");
}
finally
{
Console.WriteLine("Done");
}
Los finally
carreras de bloque cuando todo ha terminado de ejecutarse (IEnumerator<T>
apoya IDisposable
para proporcionar una manera de asegurar esto, incluso cuando se abandona la enumeración antes de que termine).
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 que (por el bien del argumento) que se lanza una excepción por uno u otro de los WriteLine
llamadas dentro del bloque try. ¿Cuál es el problema con continuar la ejecución en el bloque catch
?
Por supuesto, la parte de retorno rendimiento es (actualmente) no puede tirar nada, pero ¿por qué debería impedirnos tener un encerrando try
/catch
para hacer frente a las excepciones producidas antes o después de un yield return
?
Actualización: ¡Hay un interesting comment from Eric Lippert here - parece que ya tienen suficientes problemas para implementar correctamente el comportamiento try/finally!
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é.
Enlace directo al comentario de Eric Lippert: http://blogs.msdn.com/oldnewthing/archive/2008/08/14/8862242.aspx# 8867246 –
nota: no se puede ceder en el bloque catch tampoco :-( –