2011-11-11 14 views
6

में निर्भरता इंजेक्शन का उपयोग करते समय अपवादों को संभालना, सबसे पहले, कृपया किसी भी टाइपो को क्षमा करें क्योंकि अंग्रेजी मेरी मूल भाषा नहीं है।सी # 4.0

मान लें कि मैं अपने आवेदन में कन्स्ट्रक्टर इंजेक्शन का उपयोग करना चाहता हूं। उदाहरण के लिए, मैं ऐसा ही कुछ करना होगा:

public class FileDataProvider : IDataProvider 
{ 
    public MyData GetData() 
    { 
     // Get data from a file 
    } 
} 

public class DatabaseDataProvider : IDataProvider 
{ 
    public MyData GetData() 
    { 
     // Get data from a database 
    } 
} 

public class DataReader : IDataReader 
{ 
    private IDataProvider dataProvider; 

    public DataReader(IDataProvider dataProvider) 
    { 
     this.dataProvider = dataProvider; 
    } 

    public void OutputData() 
    { 
     MyData data = dataProvider.GetData(); 
     Console.WriteLine("{0}", data.ToString()); 
    } 
} 

अगर मैं निर्माता इंजेक्शन मैं परिभाषा से है पर कोई नियंत्रण नहीं है और न ही वर्ग को लागू करने IDataProvider कि मेरे DataReader वर्ग में इंजेक्ट किया जाएगा ठोस उदाहरण के बारे में विचार का उपयोग करें। मतलब यह है कि मेरे डेटा रीडर वर्ग में मुझे नहीं पता कि गेटडाटा विधि में क्या चल रहा है, इस तथ्य के साथ कि मुझे नहीं पता कि यह अपवाद फेंक सकता है या नहीं और यदि ऐसा है तो किस तरह का अपवाद।

मेरी आउटपुटडेटा विधि में, क्या मुझे अपना कोड किसी प्रयास {} पकड़ {} ब्लॉक में लपेटना चाहिए और यदि ऐसा है तो मुझे क्या अपवाद मिलना चाहिए? अगर मैं IOException या SQLException को पकड़ता हूं या वास्तव में कोई अपवाद का अर्थ है कि मैं कुछ तरीकों से पूर्वकल्पना कर रहा हूं IDataProvider लागू/लागू किया जाना चाहिए। मुझे नहीं लगता कि यह अच्छा है। मैं एक XMLDataProvider या NetworkResourceDataProvider इंजेक्शन भी हो सकता है। लेकिन साथ ही मुझे किसी बिंदु पर अपवादों को संभालना होगा।

मेरा प्रश्न: अपवाद को संभालने का सही तरीका क्या है और सामान्य रूप से नियंत्रण में उलझन और कन्स्ट्रक्टर इंजेक्शन का उपयोग करके किसी एप्लिकेशन में क्या होता है लॉगिंग करना क्या है? इंटरफ़ेस लागू करने वाले वर्ग में अपवाद फेंकने के लिए - सही तरीका क्या है - यदि कोई है?

-

मेरे सवाल का एक सटीक जोड़ा जा रहा है, मैं कोड है कि लागू करेगा IDataProvider तो मैं भी यकीन है कि एक कस्टम अपवाद, का कहना है कि DataProviderException फेंक दिया जाएगा नहीं किया जा सकता ही नहीं होंगे। यहां तक ​​कि यदि मैं डेवलपर्स के लिए दिशानिर्देश लिखने के लिए लिखता हूं ...

उत्तर

6

मेरी राय में IDataProvider के ठोस कार्यान्वयन को उपयुक्त अपवाद (फ़ाइल पॉविडर के लिए I/O, डीबी प्रदाता के लिए एसक्यूएल) को पकड़ना चाहिए और एक और अपवाद उठाएं जो संचार करता है डेटा प्राप्त करने में सामान्य त्रुटि, यानी DataProviderException। यदि आवश्यक हो तो आप मूल अपवाद को आंतरिक अपवाद संपत्ति के रूप में संग्रहीत कर सकते हैं ताकि जानकारी खो न जाए।

इसे इस तरह से करना DataReader उपभोक्ता को केवल इस विशेष अपवाद को संभालना है और विवरण से बचाया गया है। यह मानता है कि उपभोक्ता के पास अपवाद को संभालने का एक तरीका है, यानी एक पुनः प्रयास संभव है।

+0

सहमत हुए। आपके उपभोक्ता वर्ग को यह जानने की आवश्यकता नहीं है कि क्या हुआ। यह सिर्फ एक सामान्य रैपर अपवाद के साथ एक पैक अपवाद को पकड़ सकता है और यदि अधिक जानकारी प्रदान करने की आवश्यकता है - जैसे अपवाद पुनर्प्राप्त करने योग्य है या नहीं - इसे अपने रैपर अपवाद पर परिभाषित करें। –

+0

मैंने इसके बारे में सोचा लेकिन यह केवल तभी काम करेगा यदि मेरे पास कोड है जो 'आईडीटाप्रोवाइडर' लागू करता है जो मामला नहीं है। तो मैं वास्तव में सुनिश्चित नहीं कर सकता कि अन्य डेवलपर्स 'DataProviderException' को फेंक देंगे। मैं अभी भी कुछ दिशानिर्देश जोड़ सकता हूं लेकिन मुझे यकीन नहीं है कि उनका पालन किया जाएगा ... मैं इसे प्रतिबिंबित करने के लिए अपना प्रश्न अपडेट करूंगा। – Guillaume

+2

@ गुइलाइम: फिर बहुत उपयोगी नहीं किया जा सकता है और मैं जॉन सॉंडर्स से सहमत हूं: अगर आप इसे संभाल नहीं सकते हैं तो इसे पकड़ें – BrokenGlass

7

परिभाषा के अनुसार, यदि आप नहीं जानते कि अपवाद को कैसे संभालना है, तो इसे पकड़ें नहीं। अवधि।

+0

तो अपवादों को कहां संभाला जाना चाहिए? कहीं मेरे डी कंटेनर में? उदाहरण के लिए यदि आवश्यकता हो तो आवेदन को दुर्घटनाग्रस्त करने से पहले उपयोगकर्ता को चेतावनी देने के लिए कहीं कुछ गलत हो सकता है। – Guillaume

+0

उपयोगकर्ताओं को चेतावनी देने के लिए यह आपके डीआई कंटेनर का काम क्यों है? क्या आपके पास विंडोज फॉर्म बनाम वेब फॉर्म के लिए एक अलग कंटेनर है? नहीं? फिर आपके कंटेनर के पास UI के साथ कुछ भी नहीं होना चाहिए (चेतावनी उपयोगकर्ताओं की तरह)। और आप उपयोगकर्ता _about_ को चेतावनी देने जा रहे हैं? क्या आप उन्हें कोई भी जानकारी दे रहे हैं जिसका वे उपयोग कर सकते हैं? अपवाद को "संभालने" का प्रयास न करें, फिर देखें कि क्या होता है। –

5

मुझे यह कहकर शुरू करना है कि आपकी अंग्रेजी मेरे फ्रेंच से बेहतर है, इसलिए t'inquietes pas de ca.

यदि कोई SQLException होता है तो आप कोड में इस बिंदु पर कुछ विशेष नहीं करने जा रहे हैं, है ना?

सामान्य रूप से, आप अपवाद नहीं लेना चाहते हैं जब तक आप यह नहीं जानते कि आप इसके साथ क्या करेंगे। अपवाद आमतौर पर डेवलपर्स को यह जानने का तरीका देते हैं कि क्या गलत हुआ: यही कारण है कि आप उनके साथ जाने के लिए एक स्टैक ट्रेस प्राप्त करते हैं। इसलिए आमतौर पर यूआई के नीचे एक बिंदु तक बुलबुला करने के लिए बेहतर होता है, जहां आप उन्हें लॉग कर सकते हैं और उपयोगकर्ता को यह बताते हुए कि कुछ अप्रत्याशित हुआ।