मुझे विश्वास नहीं है कि स्थानीय कैच एक एंटी-पैटर्न हैं, वास्तव में अगर मुझे सही ढंग से याद है कि यह वास्तव में जावा में लागू है!
त्रुटि से निपटने के लिए समग्र रणनीति बनाते समय मेरे लिए क्या महत्वपूर्ण है। आप एक फ़िल्टर चाहते हैं जो सेवा सीमा पर सभी अपवादों को पकड़ता है, आप मैन्युअल रूप से उन्हें रोकना चाहते हैं - दोनों तब तक ठीक हो सकते हैं जब तक एक समग्र रणनीति है, जो आपकी टीमों के कोडिंग मानकों में आ जाएगी।
जब मैं निम्नलिखित में से एक कर सकता हूं, तो व्यक्तिगत रूप से मुझे किसी फ़ंक्शन के अंदर त्रुटियों को पकड़ना पसंद है:
- प्रासंगिक जानकारी जोड़ें (जैसे कि वस्तुओं की स्थिति या क्या चल रहा था)
- अपवाद को सुरक्षित रूप से संभालें (जैसे कि ट्रायक्स विधि)
- आपका सिस्टम एक सेवा सीमा पार कर रहा है और बाहरी लाइब्रेरी या एपीआई में कॉल कर रहा है
- आप एक अलग प्रकार के अपवाद को पकड़ना और हटाना चाहते हैं (शायद मूल अपवाद के रूप में आंतरिक अपवाद के साथ)
- अपवाद को कुछ कम मूल्य पृष्ठभूमि की कार्यक्षमता के हिस्से के रूप में फेंक दिया गया था
यदि यह इन मामलों में से एक नहीं है, तो मैं एक स्थानीय कोशिश / कैच नहीं जोड़ता हूं। यदि ऐसा है, तो परिदृश्य के आधार पर मैं अपवाद को संभाल सकता हूं (उदाहरण के लिए एक ट्राइक्स विधि जो एक गलत रिटर्न देता है) या पुनर्खरीद करता है, इसलिए अपवाद वैश्विक रणनीति द्वारा नियंत्रित किया जाएगा।
उदाहरण के लिए:
public bool TryConnectToDatabase()
{
try
{
this.ConnectToDatabase(_databaseType); // this method will throw if it fails to connect
return true;
}
catch(Exception ex)
{
this.Logger.Error(ex, "There was an error connecting to the database, the databaseType was {0}", _databaseType);
return false;
}
}
या एक पुनर्खरीद उदाहरण:
public IDbConnection ConnectToDatabase()
{
try
{
// connect to the database and return the connection, will throw if the connection cannot be made
}
catch(Exception ex)
{
this.Logger.Error(ex, "There was an error connecting to the database, the databaseType was {0}", _databaseType);
throw;
}
}
तब आप स्टैक के शीर्ष पर त्रुटि को पकड़ते हैं और उपयोगकर्ता को एक अच्छा उपयोगकर्ता के अनुकूल संदेश पेश करते हैं।
जो भी दृष्टिकोण आप लेते हैं वह हमेशा इस परिदृश्य के लिए इकाई परीक्षण बनाने के लायक है ताकि आप यह सुनिश्चित कर सकें कि कार्यक्षमता बाद में तारीख में परियोजना के प्रवाह को परिवर्तित नहीं करती है और बाधित नहीं करती है।
आपने उल्लेख नहीं किया है कि आप किस भाषा में काम कर रहे हैं, लेकिन एक .NET डेवलपर होने के नाते और इसका उल्लेख नहीं करने के लिए इसे कई बार देखा है।
मत लिखो:
catch(Exception ex)
{
throw ex;
}
उपयोग:
catch(Exception ex)
{
throw;
}
पूर्व स्टैक ट्रेस को रीसेट करता है और आपके शीर्ष स्तर को पूरी तरह से बेकार बना देता है!
TLDR
स्थानीय रूप से पकड़ना एक विरोधी पैटर्न नहीं है, यह अक्सर एक डिज़ाइन का हिस्सा हो सकता है और त्रुटि के लिए अतिरिक्त संदर्भ जोड़ने में मदद कर सकता है।