C# में एक साथ कई अपवादों को कैसे पकड़ें: पूर्ण गाइड

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

एक साथ पकड़ें: कोड डुप्लिकेशन के बिना C# में कई अपवादों को कैसे पकड़ें

\n\n

कल्पना करें: आप एक ऐसा एप्लिकेशन लिख रहे हैं जो फ़ाइलों, नेटवर्क और डेटाबेस के साथ काम करता है। एक ही मेथड में FileNotFoundException, IOException या UnauthorizedAccessException हो सकता है। क्लासिक तरीका है - तीन catch ब्लॉक जिनके अंदर एक जैसा कोड हो। यह DRY (Don't Repeat Yourself) सिद्धांत का उल्लंघन करता है और कोड को "स्पेगेटी" में बदल देता है।

\n\n

अच्छी खबर: C# में एक साथ कई अपवादों को पकड़ने के कई सुंदर तरीके हैं। इस ट्यूटोरियल में हम सभी विकल्पों पर चर्चा करेंगे - बुनियादी से लेकर उन्नत तक - और आप सीखेंगे कि कैसे स्वच्छ, रखरखाव योग्य एरर हैंडलिंग कोड लिखें।

\n\n

यह क्यों महत्वपूर्ण है? एक वास्तविक परिदृश्य

\n\n

मान लीजिए, आप बैकअप के लिए एक कंसोल एप्लिकेशन विकसित कर रहे हैं। यह फ़ाइलों को पढ़ता है, उन्हें संपीड़ित करता है और एक रिमोट सर्वर पर भेजता है। प्रत्येक चरण में अलग-अलग अपवाद हो सकते हैं:

\n\n
    \n
  • फ़ाइल पढ़ना: FileNotFoundException, PathTooLongException
  • \n
  • संपीड़न: OutOfMemoryException
  • \n
  • भेजना: HttpRequestException, TimeoutException
  • \n
\n\n

यदि आप प्रत्येक अपवाद के लिए समान लॉगिंग के साथ एक अलग catch लिखते हैं, तो कोड भारी हो जाएगा। और यदि बाद में तर्क बदलना पड़े - तो तीन जगहों पर सुधार करना होगा। यहीं पर एक साथ कई अपवादों को पकड़ने की क्षमता काम आती है।

\n\n

तरीका 1. क्लासिक: कई catch ब्लॉक (C# 6 से पहले)

\n\n

सबसे सरल और स्पष्ट तरीका है एक के बाद एक कई catch ब्लॉक लिखना। C# स्वचालित रूप से अपवाद के प्रकार के अनुसार सही ब्लॉक चुन लेगा:

\n\n
try\n{\n    // कोड जो विभिन्न अपवाद फेंक सकता है\n    string content = File.ReadAllText(@"C:\\data\\config.txt");\n    int value = int.Parse(content);\n    await SendToServerAsync(value);\n}\ncatch (FileNotFoundException ex)\n{\n    Console.WriteLine($"फ़ाइल नहीं मिली: {ex.Message}");\n    LogError(ex);\n}\ncatch (FormatException ex)\n{\n    Console.WriteLine($"डेटा का गलत प्रारूप: {ex.Message}");\n    LogError(ex);\n}\ncatch (HttpRequestException ex)\n{\n    Console.WriteLine($"नेटवर्क त्रुटि: {ex.Message}");\n    LogError(ex);\n}
\n\n

लाभ: पारदर्शी, पढ़ने में आसान, प्रत्येक अपवाद को अलग-अलग संभाला जा सकता है।
\nनुकसान: यदि क्रियाएँ समान हैं - कोड डुप्लिकेशन।

\n\n

तरीका 2. एक catch में कई अपवादों को पकड़ना (C# 6+)

\n\n

C# 6 से शुरू करके, आप एक ही catch ब्लॉक में | के माध्यम से कई प्रकार के अपवादों को सूचीबद्ध कर सकते हैं। यह डुप्लिकेशन को कम करता है और पठनीयता बनाए रखता है:

\n\n
try\n{\n    // जोखिम भरा कोड\n}\ncatch (FileNotFoundException | FormatException | HttpRequestException ex)\n{\n    Console.WriteLine($"एक त्रुटि हुई: {ex.Message}");\n    LogError(ex);\n    // तीनों प्रकारों के लिए सामान्य अतिरिक्त तर्क\n}
\n\n

महत्वपूर्ण: सभी अपवाद पदानुक्रम में संगत होने चाहिए। उदाहरण के लिए, IOException और NullReferenceException को मिलाना संभव नहीं है - Exception के अलावा उनका कोई सामान्य पूर्वज नहीं है। लेकिन C# 6+ में इसकी अनुमति है, कंपाइलर बस वेरिएबल ex को सामान्य बेस टाइप में बदल देगा।

\n\n

इस तरीके का उपयोग कब करें?

\n
    \n
  • जब सभी अपवादों के लिए हैंडलिंग तर्क समान हो।
  • \n
  • जब आप नेस्टेड if या switch ब्लॉक से बचना चाहते हैं।
  • \n
  • छोटे मेथड में, जहाँ संक्षिप्तता महत्वपूर्ण हो।
  • \n
\n\n

तरीका 3. अपवाद फ़िल्टर (C# 6+)

\n\n

अपवाद फ़िल्टर एक शक्तिशाली तंत्र है जो when कीवर्ड के साथ शर्त के आधार पर अपवादों को पकड़ने की अनुमति देता है। आप एक ही अपवाद को पकड़ सकते हैं, लेकिन उसके गुणों के आधार पर अलग-अलग तर्क के साथ:

\n\n
try\n{                

ब्लॉग

पुस्तक अनुशंसाएँ