Berikut ini tidak masalah:
try
{
Console.WriteLine("Before");
yield return 1;
Console.WriteLine("After");
}
finally
{
Console.WriteLine("Done");
}
The finally
blok berjalan ketika semuanya telah selesai mengeksekusi ( IEnumerator<T>
mendukung IDisposable
untuk menyediakan cara untuk memastikan ini bahkan ketika pencacahan ditinggalkan sebelum selesai).
Tapi ini tidak baik:
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);
}
Misalkan (demi argumen) bahwa pengecualian dilemparkan oleh salah satu WriteLine
panggilan di dalam blok percobaan. Apa masalah melanjutkan eksekusi di catch
blok?
Tentu saja, bagian pengembalian hasil (saat ini) tidak dapat melempar apa pun, tetapi mengapa hal itu menghentikan kami dari memiliki penutup try
/ catch
untuk menangani pengecualian yang dilemparkan sebelum atau sesudah yield return
?
Pembaruan: Ada komentar menarik dari Eric Lippert di sini - tampaknya mereka sudah memiliki cukup masalah dalam menerapkan perilaku coba / akhirnya dengan benar!
EDIT: Halaman MSDN tentang kesalahan ini adalah: http://msdn.microsoft.com/en-us/library/cs1x15az.aspx . Itu tidak menjelaskan mengapa.