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