다음은 괜찮습니다.
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
?
업데이트 : Eric Lippert 의 흥미로운 의견이 있습니다. 이미 try / finally 동작을 올바르게 구현하는 데 충분한 문제가있는 것 같습니다!
편집 :이 오류에 대한 MSDN 페이지는 http://msdn.microsoft.com/en-us/library/cs1x15az.aspx 입니다. 그래도 이유는 설명하지 않습니다.