Folgendes ist in Ordnung:
try
{
Console.WriteLine("Before");
yield return 1;
Console.WriteLine("After");
}
finally
{
Console.WriteLine("Done");
}
Der finally
Block wird ausgeführt, wenn die Ausführung des gesamten Objekts abgeschlossen ist ( IEnumerator<T>
unterstützt IDisposable
eine Möglichkeit, dies sicherzustellen, auch wenn die Aufzählung vor Abschluss abgebrochen wird).
Das ist aber nicht in Ordnung:
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);
}
Angenommen, (aus Gründen der Argumentation) wird eine Ausnahme von dem einen oder anderen WriteLine
Aufruf im try-Block ausgelöst . Was ist das Problem bei der Fortsetzung der Ausführung im catch
Block?
Natürlich kann der Ertragsrendite-Teil (derzeit) nichts werfen, aber warum sollte uns das davon abhalten, ein Einschließen try
/ catch
Ausnahmen zu behandeln, die vor oder nach einem geworfen werden yield return
?
Update: Es gibt hier einen interessanten Kommentar von Eric Lippert - anscheinend haben sie bereits genug Probleme, das try / finally-Verhalten korrekt zu implementieren!
BEARBEITEN: Die MSDN-Seite zu diesem Fehler lautet: http://msdn.microsoft.com/en-us/library/cs1x15az.aspx . Es erklärt jedoch nicht warum.