C # में और जावा में (और संभवतः अन्य भाषाओं में भी), "कोशिश" ब्लॉक में घोषित चर इसी "पकड़" या "अंत में" ब्लॉक के दायरे में नहीं हैं। उदाहरण के लिए, निम्नलिखित कोड संकलित नहीं करता है:
try {
String s = "test";
// (more code...)
}
catch {
Console.Out.WriteLine(s); //Java fans: think "System.out.println" here instead
}
इस कोड में, कैच ब्लॉक में s के संदर्भ में एक संकलन-टाइम त्रुटि उत्पन्न होती है, क्योंकि s केवल कोशिश ब्लॉक में स्कोप है। (जावा में, संकलन त्रुटि "s हल नहीं की जा सकती है", C # में, यह "s 'वर्तमान संदर्भ में मौजूद नहीं है"।)
इस समस्या का सामान्य हल ट्रायल ब्लॉक के बजाय वेरिएबल्स को ट्राइ ब्लॉक से ठीक पहले घोषित करना प्रतीत होता है:
String s;
try {
s = "test";
// (more code...)
}
catch {
Console.Out.WriteLine(s); //Java fans: think "System.out.println" here instead
}
हालांकि, कम से कम मेरे लिए, (1) यह एक क्लंकी समाधान की तरह लगता है, और (2) इसका परिणाम उन प्रोग्रामर में होता है, जो प्रोग्रामर के इरादे से बड़ा स्कोप होता है (केवल विधि के पूरे शेष, केवल संदर्भ में कोशिश-पकड़ने-अंत में)।
मेरा सवाल है, इस भाषा डिजाइन निर्णय (जावा में, सी # में, और / या किसी अन्य लागू भाषाओं में) के पीछे तर्क क्या हैं?