ต่อไปนี้ไม่เป็นไร:
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
ภายในบล็อกการลอง ปัญหาในการดำเนินการต่อในcatch
บล็อกคืออะไร?
แน่นอนว่าส่วนที่ให้ผลตอบแทนคือ (ในปัจจุบัน) ไม่สามารถโยนอะไรได้ แต่เหตุใดจึงควรหยุดเราจากการปิดล้อมtry
/ catch
จัดการกับข้อยกเว้นที่โยนก่อนหรือหลัง a yield return
?
อัปเดต:มีความคิดเห็นที่น่าสนใจจาก Eric Lippert ที่นี่ - ดูเหมือนว่าพวกเขามีปัญหาเพียงพอในการใช้พฤติกรรม try / ในที่สุดอย่างถูกต้องแล้ว!
แก้ไข: หน้า MSDN ในข้อผิดพลาดนี้: http://msdn.microsoft.com/en-us/library/cs1x15az.aspx มันไม่ได้อธิบายว่าทำไม