В порядке:
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
для обработки исключений, которые были выбраны до или после yield return
?
Обновление: Там интересный комментарий от Эрика Липперта здесь - кажется, что у них уже достаточно проблем с реализацией попытки/окончательно корректно!
EDIT: на странице MSDN этой ошибки: http://msdn.microsoft.com/en-us/library/cs1x15az.aspx. Однако он не объясняет, почему.