O seguinte está certo:
try
{
Console.WriteLine("Before");
yield return 1;
Console.WriteLine("After");
}
finally
{
Console.WriteLine("Done");
}
O finally
bloco é executado quando a execução de toda a coisa termina ( IEnumerator<T>
oferece IDisposable
uma maneira de garantir isso mesmo quando a enumeração é abandonada antes de terminar).
Mas isso não está bem:
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);
}
Suponha (para fins de argumentação) que uma exceção seja lançada por uma ou outra das WriteLine
chamadas dentro do bloco try. Qual é o problema em continuar a execução em catch
bloco?
Obviamente, a parte do retorno do rendimento é (atualmente) incapaz de lançar qualquer coisa, mas por que isso deveria nos impedir de ter um fechamento try
/ catch
para lidar com exceções lançadas antes ou depois de um yield return
?
Atualização: Há um comentário interessante de Eric Lippert aqui - parece que eles já têm problemas suficientes para implementar o comportamento try / finally corretamente!
EDIT: A página MSDN sobre este erro é: http://msdn.microsoft.com/en-us/library/cs1x15az.aspx . Mas não explica o porquê.