Poniższe są w porządku:
try
{
Console.WriteLine("Before");
yield return 1;
Console.WriteLine("After");
}
finally
{
Console.WriteLine("Done");
}
finally
Blok pracuje, gdy cała sprawa zakończyła wykonywanie ( IEnumerator<T>
podpory IDisposable
, aby zapewnić sposób, aby zapewnić to nawet wtedy, gdy wyliczenie zostanie przerwany przed jej zakończeniem).
Ale to nie jest w porządku:
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);
}
Załóżmy (ze względu na argument), że jedno lub drugie WriteLine
wywołanie wewnątrz bloku try zgłasza wyjątek . Jaki jest problem z kontynuowaniem wykonywania w catch
bloku?
Oczywiście, część zwrotu z zysku nie jest (obecnie) w stanie niczego rzucić, ale dlaczego to powinno nas powstrzymywać od dołączania try
/ catch
zajmowania się wyjątkami rzucanymi przed lub po yield return
?
Aktualizacja: Jest tu ciekawy komentarz od Erica Lipperta - wydaje się, że mają już wystarczająco dużo problemów z poprawnym wdrożeniem zachowania try / final!
EDYTUJ: Strona MSDN dotycząca tego błędu to: http://msdn.microsoft.com/en-us/library/cs1x15az.aspx . Nie wyjaśnia to jednak, dlaczego.