C# में त्रुटि प्रबंधन: try/catch और अन्य
त्रुटि प्रबंधन विश्वसनीय सॉफ्टवेयर के प्रमुख घटकों में से एक है। C# में इस उद्देश्य के लिए अपवाद तंत्र (exceptions) का उपयोग किया जाता है। try, catch और finally संरचनाओं का सही उपयोग न केवल प्रोग्राम को क्रैश होने से बचाता है, बल्कि कोड को अधिक पठनीय और अनुमानित भी बनाता है। इस लेख में हम अपवाद प्रबंधन की मूल बातें, सर्वोत्तम प्रथाएँ और .NET प्लेटफ़ॉर्म द्वारा प्रदान की जाने वाली उन्नत सुविधाओं पर चर्चा करेंगे।
1. मूल ब्लॉक try/catch/finally
C# में त्रुटि प्रबंधन का मुख्य उपकरण try-catch-finally ब्लॉक है। इसका सिंटैक्स सहज है:
- try — उस कोड को रखता है जो अपवाद फेंक सकता है।
- catch — अपवाद को पकड़ता है और संसाधित करता है।
- finally — हमेशा निष्पादित होता है, चाहे अपवाद हुआ हो या नहीं। इसका उपयोग संसाधनों को मुक्त करने (फ़ाइलें बंद करना, DB कनेक्शन) के लिए किया जाता है।
आइए एक सरल उदाहरण देखें — शून्य से भाग देना:
using System;
class Program{ static void Main() { try { int a = 10; int b = 0; int result = a / b; // यहाँ अपवाद उत्पन्न होगा Console.WriteLine($"परिणाम: {result}"); } catch (DivideByZeroException ex) { Console.WriteLine($"त्रुटि: {ex.Message}"); } finally { Console.WriteLine("finally ब्लॉक निष्पादित हुआ।"); } }}प्रोग्राम का आउटपुट:
त्रुटि: शून्य से भाग देने का प्रयास।finally ब्लॉक निष्पादित हुआ।ध्यान दें: यदि आप अपवाद का विशिष्ट प्रकार निर्दिष्ट नहीं करते हैं, तो catch ब्लॉक सभी अपवादों को पकड़ लेगा। यह सुविधाजनक हो सकता है, लेकिन इसे अक्सर खराब प्रथा माना जाता है क्योंकि यह वास्तविक समस्याओं को छुपाता है।
2. अपवादों के प्रकार और उनका पदानुक्रम
C# में सभी अपवाद आधार वर्ग System.Exception से विरासत में मिलते हैं। सबसे अधिक उपयोग किए जाने वाले:
SystemException— सिस्टम अपवादों के लिए आधार वर्ग।NullReferenceException— उस ऑब्जेक्ट तक पहुँचना जोnullहै।IndexOutOfRangeException— ऐरे की सीमा से बाहर जाना।InvalidOperationException— किसी विधि को अमान्य अवस्था में कॉल करना।ArgumentExceptionऔर इसके वंशज (ArgumentNullException,ArgumentOutOfRangeException) — विधि के गलत तर्क।
आप एक ही catch ब्लॉक में कई प्रकार के अपवादों को पकड़ सकते हैं (C# 6 से शुरू):
try{ // कोड}catch (ArgumentNullException ex) when (ex.ParamName == "userId"){ Console.WriteLine("पैरामीटर userId null नहीं होना चाहिए।");}catch (InvalidOperationException ex){ Console.WriteLine($"अमान्य संक्रिया: {ex.Message}");}catch (Exception ex) when (Log(ex, "अज्ञात त्रुटि")){ // अपवाद फ़िल्टर — ब्लॉक तभी निष्पादित होता है जब शर्त सत्य हो throw; // अपवाद को आगे भेजें}अपवाद फ़िल्टर (कीवर्ड when) आपको कॉल स्टैक को खोए बिना प्रबंधन तर्क को अधिक लचीले ढंग से नियंत्रित करने की अनुमति देते हैं।
3. स्वयं के अपवाद उत्पन्न करना
कभी-कभी मानक अपवाद पर्याप्त नहीं होते हैं। आप Exception से विरासत प्राप्त करके अपना स्वयं का अपवाद वर्ग बना सकते हैं:
public class InvalidAgeException : Exception{ public int Age { get; }
public InvalidAgeException(int age, string message) : base(message) { Age = age; }
public InvalidAgeException(int age, string message, Exception inner) : base(message, inner) { Age = age; }}अब```