निम्नलिखित ठीक है:
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
yield return
अद्यतन: यहां एरिक लिपर्ट की एक दिलचस्प टिप्पणी है - ऐसा लगता है कि उनके पास पहले से ही पर्याप्त रूप से कोशिश / अंत में व्यवहार को सही ढंग से लागू करने में काफी समस्याएं हैं!
संपादित करें: इस त्रुटि पर MSDN पृष्ठ है: http://msdn.microsoft.com/en-us/library/cs1x15az.aspx । यह क्यों, हालांकि समझा नहीं है।