Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C#

C# में स्टैक ट्रेस खोए बिना InnerException को कैसे रीथ्रो करें

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);❌ खो गयाकेवल यदि मूल अप्रासंगिक है

सर्वोत्तम अभ्यास

  1. हमेशा throw; का उपयोग करें न कि throw ex;
  2. संदर्भ जोड़ने के लिए एक्सेप्शन रैप करें: throw new CustomException("Context", originalEx)
  3. शर्ती कैच के लिए एक्सेप्शन फिल्टर्स (when) का उपयोग करें
  4. catch ब्लॉक में लॉगिंग के बाद throw; का उपयोग करें
  5. खाली catch { throw; } से बचें - बस catch ब्लॉक न रखें
  1. विंडोज 10/11 को बिना किसी फाइल या प्रोग्राम को खोए सुरक्षित रूप से रिपेयर करें विंडोज 10/11 को बिना किसी फाइल या प्रोग्राम को खोए सुरक्षित रूप से रिपेयर करें

    यदि आप सीखना चाहते हैं कि विंडोज 10/11 को फाइलें और प्रोग्राम खोए बिना कैसे रिपेयर करें, तो नीचे पढ़ना जारी रखें। विंडोज 10 डिवाइस विभिन्न त्रुटियों और खराबी का अनुभव कर सकते हैं, शायद भ्रष्ट सिस्टम फाइलों, डिवाइस ड्राइवर त्रुटियों, हार्डवेयर समस्याओं, या अन्य ब्लू स्क्रीन ऑफ डेथ (BSOD) संबंधी त्रुट

  1. WhatsApp पर फुल क्वालिटी में फोटो कैसे भेजें: स्टेप-बाय-स्टेप गाइड WhatsApp पर फुल क्वालिटी में फोटो कैसे भेजें: स्टेप-बाय-स्टेप गाइड

    WhatsApp निर्विवाद रूप से कम्युनिकेशन के लिए एक बेहतरीन एप्लिकेशन है, लेकिन यह निश्चित रूप से फोटो शेयर करने के लिए एक आदर्श प्लेटफॉर्म नहीं है। यदि आपने कभी WhatsApp Messenger के माध्यम से कोई तस्वीर भेजी है, तो आपने देखा होगा कि रिजॉल्यूशन काफी छोटा हो जाता है। छवि थोड़ी धुंधली और पिक्सेलेटेड हो ज

  1. विंडोज 10 पर डेटा हानि के बिना डिस्क को सुरक्षित रूप से इनिशियलाइज़ करें विंडोज 10 पर डेटा हानि के बिना डिस्क को सुरक्षित रूप से इनिशियलाइज़ करें

    विंडोज 10 लैपटॉप या डेस्कटॉप पर इंस्टॉल की गई हार्ड ड्राइव कभी-कभी Unknown Not Initialized त्रुटि दिखा सकती है। यह त्रुटि विंडोज 10 कंप्यूटर पर डिस्क मैनेजमेंट मेनू में दिखाई देती है। ऐसे परिदृश्य में, उपयोगकर्ता उस ड्राइव की सामग्री तक पहुंचने में असमर्थ होते हैं। जब तक आप इसे इनिशियलाइज़ नहीं करते