The following is okay:
try
{
Console.WriteLine("Before");
yield return 1;
Console.WriteLine("After");
}
finally
{
Console.WriteLine("Done");
}
The finally
block runs when the whole thing has finished executing (IEnumerator<T>
supports IDisposable
to provide a way to ensure this even when the enumeration is abandoned before it finishes).
But this is not okay:
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);
}
Suppose (for the sake of argument) that an exception is thrown by one or other of the WriteLine
calls inside the try block. What's the problem with continuing the execution in catch
block?
Of course, the yield return part is (currently) unable to throw anything, but why should that stop us from having an enclosing try
/catch
to deal with exceptions thrown before or after a yield return
?
Update: There's an interesting comment from Eric Lippert here - seems that they already have enough problems implementing the try/finally behaviour correctly!
EDIT: The MSDN page on this error is: http://msdn.microsoft.com/en-us/library/cs1x15az.aspx. It doesn't explain why, though.