हर बार मुझे एक अपवाद के बारे में अतिरिक्त जानकारी प्रदान करने की आवश्यकता होती है, मुझे आश्चर्य होता है कि वास्तव में ऐसा करने का सही तरीका क्या है।
इस सवाल के लिए मैंने एक उदाहरण लिखा। मान लेते हैं कि एक वर्ग है जहाँ हम Abbreviation
संपत्ति को अद्यतन करना चाहते हैं। ठोस दृष्टिकोण से, यह सही नहीं हो सकता है, लेकिन भले ही हमने किसी सेवा के साथ डीआई के माध्यम से कार्यकर्ता-विधि पारित की हो , एक ही स्थिति उत्पन्न होती है - एक अपवाद होता है इसका कोई संदर्भ नहीं है। उदाहरण पर वापस जाएं ...
class Person
{
public int Id { get; set; }
public string Name { get; set; }
public string Abbreviation { get; set; }
}
फिर वर्ग और लूप के कुछ उदाहरण हैं जहां कार्यकर्ता-विधि कहा जाता है। यह फेंक सकता है StringTooShortException
।
var persons =
{
new Person { Id = 1, Name = "Fo" },
new Person { Id = 2, Name = "Barbaz" },
}
public IEnumerable<Person> GenerateAbbreviation(IEnumerable<Person> persons)
{
foreach (var person in persons)
{
try
{
person.Abbreviation = GenerateAbbreviation(person.Name);
}
catch(Exception ex)
{
// ?
}
}
// throw AggregateException...
}
public IEnumerable<string> GenerateAbbreviation(string value)
{
if (value.Length < 5)
{
throw new StringTooShortException(value);
}
// generate abbreviation
}
उद्धरण है: कैसे Person
या इसके Id
(या कुछ और) जोड़ने के लिए ?
मैं निम्नलिखित तीन तकनीकों को जानता हूं:
1 - Data
संपत्ति का उपयोग करें
पेशेवरों:
- अतिरिक्त जानकारी सेट करना आसान है
- और भी अधिक अपवाद बनाने की आवश्यकता नहीं है
- अतिरिक्त की आवश्यकता नहीं है
try/catch
विपक्ष:
- में आसानी से एकीकृत नहीं किया जा सकता है
Message
- लोग इस फ़ील्ड को अनदेखा करते हैं और इसे डंप नहीं करेंगे
- कुंजियों की आवश्यकता होती है और डीसैस का मान कास्टिंग होता है
object
- अपरिवर्तनीय नहीं है
उदाहरण:
public IEnumerable<Person> GenerateAbbreviation(IEnumerable<Person> persons)
{
foreach (var person in persons)
{
try
{
person.Abbreviation = GenerateAbbreviation(person.Name);
}
catch(Exception ex)
{
ex.Data["PersonId"] = person.Id;
// collect ex
}
}
// throw AggregateException...
}
2 - कस्टम गुणों का उपयोग करें
पेशेवरों:
Data
संपत्ति के समान लेकिन दृढ़ता से टाइप किया गया- में एकीकृत करने के लिए आसान है
Message
विपक्ष:
- कस्टम अपवाद की आवश्यकता है
- लकड़हारा उनकी उपेक्षा करेगा
- अपरिवर्तनीय नहीं है
उदाहरण:
public IEnumerable<Person> GenerateAbbreviation(IEnumerable<Person> persons)
{
foreach (var person in persons)
{
try
{
person.Abbreviation = GenerateAbbreviation(person.Name);
}
catch(Exception ex)
{
// not suitable for this exception because
// it doesn't have anything in common with the Person
}
}
// throw AggregateException...
}
3 - अपवाद को दूसरे अपवाद के साथ लपेटें
पेशेवरों:
Message
पूर्वानुमानित रूप में स्वरूपित किया जा सकता है- लकड़हारे आंतरिक अपवादों को छोड़ देंगे
- अडिग
विपक्ष:
- अतिरिक्त की आवश्यकता है
try/catch
- घोंसले के शिकार
- शकों की गहराई का अनुमान लगाता है
उदाहरण:
public IEnumerable<Person> GenerateAbbreviation(IEnumerable<Person> persons)
{
foreach (var person in persons)
{
try
{
try
{
person.Abbreviation = GenerateAbbreviation(person.Name);
}
catch(Exception ex)
{
throw new InvalidPersonDataException(person.Id, ex);
}
}
catch(Exception ex)
{
// collect ex
}
}
// throw AggregateException...
}
- क्या कोई अन्य पैटर्न हैं?
- क्या बेहतर पैटर्न हैं?
- क्या आप उनमें से किसी भी / सभी के लिए सर्वोत्तम अभ्यास सुझा सकते हैं?