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

C# में एक्सेप्शन हैंडलिंग के सर्वोत्तम अभ्यास

प्रभावी एक्सेप्शन हैंडलिंग मजबूत, रखरखाव योग्य और डीबग करने योग्य एप्लिकेशन के लिए महत्वपूर्ण है। यहां C# में सर्वोत्तम अभ्यास दिए गए हैं।

1. लॉगिंग फ्रेमवर्क का उपयोग करें

// Serilog, NLog, log4net, Microsoft.Extensions.Logging
private readonly ILogger _logger;

try {
    // जोखिम भरा ऑपरेशन
}
catch (Exception ex) {
    _logger.LogError(ex, "Failed to process order {OrderId}", orderId);
    throw; // पुन: फेंकें यदि हैंडल नहीं कर सकते
}

2. हर एक्सेप्शन को लॉग करें

  • एप्लिकेशन में हर अनकैच्ड एक्सेप्शन लॉग होना चाहिए।
  • लॉग्स समस्याओं का पता लगाने में मदद करते हैं (LOC - लाइन्स ऑफ कोड)।
  • संरचित लॉगिंग (JSON) उपयोग करें ताकि क्वेरी/विश्लेषण आसान हो।

3. प्रासंगिक विवरण लॉग करें

// खराब
_logger.LogError("Error occurred");

// अच्छा
_logger.LogError(ex, 
    "Failed to charge customer {CustomerId} for order {OrderId} amount {Amount}",
    customerId, orderId, amount);

4. एक्सेप्शन मॉनिटरिंग टूल उपयोग करें

  • Sentry, Datadog, New Relic, Application Insights, Elmah, Raygun
  • सभी सर्वर्स/एप्लिकेशन्स से एक्सेप्शन सेंट्रलाइज़ करें।
  • डुप्लिकेट एक्सेप्शन ग्रुपिंग, अलर्टिंग, ट्रेंड विश्लेषण।
  • स्टैक ट्रेस, लोकल वेरिएबल्स, यूजर कॉन्टेक्स्ट, ब्रेडक्रम्ब्स।

5. एक्सेप्शन प्रकार चुनें

// विशिष्ट एक्सेप्शन फेंकें
if (user == null) throw new ArgumentNullException(nameof(user));
if (amount <= 0) throw new ArgumentOutOfRangeException(nameof(amount));
if (!account.Exists) throw new InvalidOperationException("Account not found");

// कस्टम एक्सेप्शन
public class InsufficientFundsException : Exception {
    public decimal Balance { get; }
    public decimal Requested { get; }
    
    public InsufficientFundsException(decimal balance, decimal requested)
        : base($"Insufficient funds. Balance: {balance}, Requested: {requested}") {
        Balance = balance;
        Requested = requested;
    }
}

6. Catch ब्लॉक्स में सर्वोत्तम अभ्यास

try {
    // ...
}
catch (SqlException ex) when (ex.Number == 1205) { // डेडलॉक
    // रिट्री लॉजिक
}
catch (TimeoutException) {
    // टाइमआउट हैंडलिंग
}
catch (Exception ex) {
    // अनपेक्षित - लॉग करें और पुन: फेंकें
    _logger.LogCritical(ex, "Unexpected error");
    throw;
}
finally {
    // क्लीनअप (IDisposable, लॉक रिलीज, आदि)
}

7. क्या न करें (Anti-patterns)

  • खाली catch: `catch { }` - बग छुपाता है
  • पकड़कर पुन: फेंकना: `catch (Exception ex) { throw ex; }` - स्टैक ट्रेस खो देता है (उपयोग करें: `throw;`)
  • कंट्रोल फ्लो के लिए एक्सेप्शन: सामान्य फ्लो के लिए एक्सेप्शन न फेंकें
  • सामान्य Exception पकड़ना: विशिष्ट एक्सेप्शन प्रकार पकड़ें

8. ग्लोबल एक्सेप्शन हैंडलिंग

// ASP.NET Core
app.UseExceptionHandler("/Error");
app.UseDeveloperExceptionPage(); // केवल डेवलपमेंट में

// Windows Forms / WPF
Application.ThreadException += (s, e) => Log(e.Exception);
AppDomain.CurrentDomain.UnhandledException += (s, e) => Log(e.ExceptionObject);

सारांश चेकलिस्ट

  • ☐ संरचित लॉगिंग (Serilog/NLog/MS.Extensions.Logging)
  • ☐ हर अनकैच्ड एक्सेप्शन लॉग होता है
  • ☐ प्रासंगिक विवरण (IDs, इनपुट्स, स्टेट) शामिल हैं
  • ☐ एक्सेप्शन मॉनिटरिंग टूल कॉन्फ़िगर है
  • ☐ विशिष्ट एक्सेप्शन प्रकार उपयोग किए जाते हैं
  • ☐ `throw;` उपयोग होता है, `throw ex;` नहीं
  • ☐ `finally` / `using` / `IDisposable` से क्लीनअप
  • ☐ ग्लोबल हैंडलर कॉन्फ़िगर है
  1. C++ में एक्सेप्शन कैसे काम करते हैं C++ में एक्सेप्शन कैसे काम करते हैं

    परिचयC++ में एक्सेप्शन हैंडलिंग रनटाइम त्रुटियों को संभालने की एक प्रक्रिया है। एक्सेप्शन एक घटना है जो C++ में रनटाइम पर फेंकी जाती है। सभी एक्सेप्शन std::exception क्लास से प्राप्त होते हैं। यह एक रनटाइम त्रुटि है जिसे संभाला जा सकता है। यदि हम एक्सेप्शन को नहीं संभालते हैं तो यह एक्सेप्शन संदेश प

  1. Pry में अपवाद हैंडलिंग में महारत हासिल करें: Rails कंसोल के लिए उन्नत तकनीकें Pry में अपवाद हैंडलिंग में महारत हासिल करें: Rails कंसोल के लिए उन्नत तकनीकें

    यदि आप मेरी तरह हैं, तो आप Rails कंसोल का बहुत उपयोग करते हैं। और अब तक मुझे लगता है कि हर कोई सहमत है कि Pry, Rails कंसोल के लिए अब तक की सबसे अच्छी चीज है... ठीक है, कभी भी। Pry में अंतर्निहित कुछ वास्तव में कूल फीचर्स हैं जो अपवादों के साथ काम करना सादे पुराने IRB की तुलना में बहुत आसान बनाते हैं

  1. Ruby में कस्टम अपवाद में महारत हासिल करें: एक चरण-दर-चरण गाइड Ruby में कस्टम अपवाद में महारत हासिल करें: एक चरण-दर-चरण गाइड

    Ruby में अपने स्वयं के अपवाद बनाना आसान है। बस इन चरणों का पालन करें: 1. एक नई क्लास बनाएं अपवाद क्लास हैं, Ruby में बाकी सब की तरह! एक नए प्रकार का अपवाद बनाने के लिए, बस एक क्लास बनाएं जो StandardError, या उसके बच्चों में से एक से इनहेरिट करती है। class MyError < StandardError end raise MyError