以下是可以的:
try
{
Console.WriteLine("Before");
yield return 1;
Console.WriteLine("After");
}
finally
{
Console.WriteLine("Done");
}
finally
当整个事情完成执行时,该块运行(IEnumerator<T>
支持IDisposable
提供一种方法来确保这一点,即使枚举在它完成之前被放弃)。
但这不行:
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);
}
假设(为了论证)WriteLine
try 块内的一个或其他调用引发了异常。继续执行catch
块有什么问题?
当然,yield return 部分(当前)无法抛出任何东西,但是为什么这会阻止我们使用封闭的try
/catch
来处理在 a 之前或之后抛出的异常yield return
呢?
更新:这里有来自 Eric Lippert的有趣评论- 似乎他们在正确实施 try/finally 行为时已经遇到了足够多的问题!
编辑:有关此错误的 MSDN 页面是:http: //msdn.microsoft.com/en-us/library/cs1x15az.aspx。但是,它没有解释原因。