没关系:
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
块有什么问题?
当然,收益率返回部分(当前)无法抛出任何东西,但是为什么那应该阻止我们封闭try
/ catch
处理在a之前或之后抛出的异常yield return
呢?
更新:这里有来自Eric Lippert的有趣评论 -似乎他们已经有足够的问题才能正确实现try / finally行为!
编辑:关于此错误的MSDN页面是:http : //msdn.microsoft.com/zh-cn/library/cs1x15az.aspx。但是,它没有解释原因。