Це нормально:
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
?
Оновлення: Тут є цікавий коментар Еріка Ліпперта - здається, у них вже є достатньо проблем із правильною поведінкою try / нарешті!
РЕДАГУВАТИ: Сторінка MSDN з цією помилкою: http://msdn.microsoft.com/en-us/library/cs1x15az.aspx . Однак це не пояснює, чому.