प्रभावी एक्सेप्शन हैंडलिंग मजबूत, रखरखाव योग्य और डीबग करने योग्य एप्लिकेशन के लिए महत्वपूर्ण है। यहां 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` से क्लीनअप
- ☐ ग्लोबल हैंडलर कॉन्फ़िगर है