C# में, throw एक कीवर्ड है और यह प्रोग्राम के निष्पादन के दौरान मैन्युअली एक्सेप्शन फेंकने के लिए उपयोगी है और हम उन फेंके गए एक्सेप्शन को try-catch ब्लॉक्स का उपयोग करके अपनी आवश्यकताओं के आधार पर संभाल सकते हैं।
catch ब्लॉक में throw कीवर्ड का उपयोग करके, हम उस एक्सेप्शन को री-थ्रो कर सकते हैं जिसे catch ब्लॉक में संभाला गया है। एक्सेप्शन को री-थ्रो करना उपयोगी होता है जब हम एक्सेप्शन को कॉलर को पास करना चाहते हैं ताकि वे इसे अपने तरीके से संभाल सकें।
सही तरीका: केवल throw का उपयोग करें
class Program
{
static void Main(string[] args)
{
try
{
Method2();
}
catch (Exception ex)
{
Console.WriteLine($"{ex.StackTrace} {ex.Message}");
}
Console.ReadLine();
}
static void Method2()
{
try
{
Method1();
}
catch (Exception)
{
throw; // सही: मूल स्टैक ट्रेस संरक्षित करता है
}
}
static void Method1()
{
try
{
throw new NullReferenceException("Null Exception error");
}
catch (Exception)
{
throw; // सही: मूल स्टैक ट्रेस संरक्षित करता है
}
}
}
आउटपुट (स्टैक ट्रेस संरक्षित)
at Program.Method1() in ...\Program.cs:line 49
at Program.Method2() in ...\Program.cs:line 37
at Program.Main(String[] args) in ...\Program.cs:line 24
Null Exception error
गलत तरीका: throw ex (स्टैक ट्रेस खो देता है)
static void Method2_Bad()
{
try
{
Method1();
}
catch (Exception ex)
{
throw ex; // गलत! स्टैक ट्रेस रीसेट हो जाता है
}
}
आउटपुट (स्टैक ट्रेस खो गया)
at Program.Method2_Bad() in ...\Program.cs:line XX // Method1 गायब!
Null Exception error
एक्सेप्शन रैपिंग (जब आपको संदर्भ जोड़ने की आवश्यकता हो)
static void Method2_Wrap()
{
try
{
Method1();
}
catch (Exception ex)
{
// नया एक्सेप्शन फेंकें जिसमें मूल InnerException के रूप में हो
throw new InvalidOperationException("Failed to process user request", ex);
}
}
// कॉलर में
try
{
Method2_Wrap();
}
catch (InvalidOperationException ex)
{
Console.WriteLine($"Outer: {ex.Message}");
Console.WriteLine($"Inner: {ex.InnerException?.Message}");
Console.WriteLine($"Full stack trace preserved in InnerException");
}
एक्सेप्शन फिल्टर्स (C# 6+) - स्टैक ट्रेस संरक्षित करते हुए शर्तें
try
{
RiskyOperation();
}
catch (SqlException ex) when (ex.Number == 1205) // डेडलॉक
{
// स्टैक ट्रेस संरक्षित रहता है क्योंकि हम रीथ्रो नहीं कर रहे
HandleDeadlock(ex);
}
catch (Exception ex) when (ShouldLog(ex))
{
Log(ex);
throw; // रीथ्रो - स्टैक ट्रेस संरक्षित
}
सारांश तालिका
| सिंटैक्स | स्टैक ट्रेस | उपयोग का मामला |
|---|---|---|
throw; | ✅ संरक्षित | रीथ्रो समान एक्सेप्शन |
throw ex; | ❌ रीसेट (वर्तमान लाइन) | कभी न उपयोग करें |
throw new Ex(msg, ex); | ✅ InnerException में संरक्षित | संदर्भ/रैपिंग जोड़ें |
throw new Ex(msg); | ❌ खो गया | केवल यदि मूल अप्रासंगिक है |
सर्वोत्तम अभ्यास
- हमेशा
throw;का उपयोग करें न किthrow ex; - संदर्भ जोड़ने के लिए एक्सेप्शन रैप करें:
throw new CustomException("Context", originalEx) - शर्ती कैच के लिए एक्सेप्शन फिल्टर्स (
when) का उपयोग करें catchब्लॉक में लॉगिंग के बादthrow;का उपयोग करें- खाली
catch { throw; }से बचें - बसcatchब्लॉक न रखें