5

NHibernate में अपवाद से निपटने के लिए सबसे अच्छा अभ्यास क्या है? इस प्रकारहैंडलिंग NHibernate अपवाद

public void Add(Subject subject) 
    { 
     using (ISession session = HibernateUtil.CurrentSession) 
     using (ITransaction transaction = session.BeginTransaction()) 
     { 

      session.Save(subject); 
      transaction.Commit(); 
     } 
    } 

और एक यूनिट टेस्ट:

मैं निम्नलिखित के साथ एक SubjectRepository मिल गया है

 [Test] 
    public void TestSaveDuplicate() 
    { 
     var subject = new Subject 
     { 
      Code = "En", 
      Name = "English" 
     }; 

     _subjectRepository.Add(subject); 

     var duplicateSubject = new Subject 
     { 
      Code = "En", 
      Name = "English1" 
     }; 

     _subjectRepository.Add(duplicateSubject); 
    } 

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

ADOException एक MySQL अपवाद एक समझदार त्रुटि संदेश है कि लपेटता लेकिन मैं सिर्फ भीतरी अपवाद फेंक कर कैप्सूलीकरण तोड़ने शुरू करने के लिए नहीं करना चाहती। विशेष रूप से MySQL को इस प्रोजेक्ट के बैक एंड के रूप में अंतिम रूप दिया नहीं गया है।

आदर्श रूप में मैं अपवाद को पकड़ने और इस बिंदु पर उपयोगकर्ता के लिए एक समझदार त्रुटि वापस करने में सक्षम होना चाहते हैं। क्या NHBernate अपवादों को संभालने और उपयोगकर्ता को वापस रिपोर्ट करने के लिए गलत तरीके से रिपोर्ट करने के लिए कोई दस्तावेजी सर्वोत्तम अभ्यास दृष्टिकोण हैं और क्यों?

धन्यवाद,

मैट

उत्तर

13

मैं जैसे विधि जोड़ें इसे संभाल होगा:

public void Add(Subject subject) 
{ 
    using (ISession session = HibernateUtil.CurrentSession) 
    using (ITransaction transaction = session.BeginTransaction()) 
    { 
     try 
     { 
      session.Save(subject); 
      transaction.Commit(); 
     } 
     catch (Exception ex) 
     { 
      transaction.Rollback(); 
      // log exception 
      throw; 
     } 
    } 
} 

कैच ब्लॉक में, आप पहले लेनदेन रोलबैक और अपवाद लॉग इन करना चाहिए। फिर अपने विकल्प हैं:

  1. Rethrow एक ही अपवाद है, जो है क्या मेरी संस्करण करता
  2. अपने स्वयं के अपवाद में लपेट और फेंक कि
  3. कुछ नहीं कर रहे द्वारा अपवाद निगल, जो बहुत मुश्किल से ही एक अच्छा है विचार

आपके पास इस विधि में अपवाद को संभालने के लिए कोई वास्तविक विकल्प नहीं है। यह मानते हुए कि यूआई इस विधि को कॉल करता है, इसे इसे अपने प्रयास में कॉल करना चाहिए .. उपयोगकर्ता को सार्थक त्रुटि संदेश प्रदर्शित करके इसे पकड़ें और इसे संभालें।आप ExpectedException (प्रकार) विशेषता का उपयोग करके अपना यूनिट परीक्षण पास कर सकते हैं।

सीधे अपने प्रश्न का उत्तर देने के लिए, आपको अपवाद को बढ़ाकर अपनी "समझदार त्रुटि" बनाना चाहिए और इसे मूल अपवाद के साथ अपने इनरएक्सप्शन के रूप में फेंक देना चाहिए। यह अपवाद रैपिंग तकनीक है जिसे मैंने सूचीबद्ध किया है (2)।

+0

मुझे लगता है कि अपवाद लपेटना भी सबसे अच्छा विकल्प है। आंतरिक अपवाद MySQLException संदेश = "डुप्लिकेट एंट्री 'एन' कुंजी 3 के लिए 'के साथ कुछ है। क्योंकि इसे सीधे सामने के अंत में बुलाया जाएगा, मैं एक सार्थक संदेश वापस करना चाहता हूं। –

+0

क्या यह अच्छा विचार है, सभी अपवादों को पकड़ने और इसे लपेटने के लिए? – VikciaR

+0

यदि आप केवल अपवाद को पुनर्स्थापित कर रहे हैं, तो आप इस कोड में से अधिकांश को हटा सकते हैं - यदि कोई लेनदेन स्पष्ट रूप से प्रतिबद्ध नहीं होता है, तो सत्र बंद होने पर इसे वापस ले जाया जाएगा (या स्पष्ट रूप से यदि प्रतिबद्ध कॉल अपवाद फेंक रहा है तो यह होगा इसे वापस रोल करने का प्रयास करें), इसलिए अपवाद को छोड़ दें और एनएच लेनदेन का ख्याल रखेगा यदि उसने प्रतिबद्ध नहीं किया है - आपको क्लीनर कोड के साथ समान प्रभाव मिलेंगे। –

1

सामान्य प्रश्न होने जा रहा है, क्या आप उपयोगकर्ता बताने के लिए चाहते हैं, और जो उपयोगकर्ता है?

उपयोगकर्ता कभी कभी किसी अन्य कंप्यूटर (अर्थात, यह एक वेब सेवा है), तो आप उचित तंत्र का उपयोग करने के एक सोप दोष या HTTP त्रुटि वापस जाने के लिए चाहते हो जाएगा हो जाएगा।

उपयोगकर्ता कभी कभी किसी प्रकार की यूआई हो जाएगा, तो आप उपयोगकर्ता के लिए संदेश प्रदर्शित करने के लिए चाहते हो सकता है, लेकिन ऐसा वह इसके बारे में कुछ कर सकते हैं कि आप क्या उपयोगकर्ता बताएंगे? उदाहरण के लिए, अधिकांश वेबसाइटें कहेंगी, "क्षमा करें, हमें एक अनपेक्षित त्रुटि मिली", इससे कोई फर्क नहीं पड़ता कि क्या कारण है। ऐसा इसलिए है क्योंकि उपयोगकर्ता आमतौर पर त्रुटि के बारे में कुछ भी नहीं कर सकता है।

लेकिन दोनों ही मामलों में, कैसे "उपयोगकर्ता" बताने के लिए की पसंद प्रस्तुति परत (यूआई स्तरीय), दाल के लिए नहीं करने के लिए एक मामला है। आपको संभवतः किसी अन्य अपवाद प्रकार में डीएएल से अपवाद लपेटना चाहिए, लेकिन केवल तभी जब आप संदेश को बदलने जा रहे हैं। आपको अपनी अपवाद कक्षा की आवश्यकता नहीं है, जब तक कि आपके कॉलर्स कुछ अलग नहीं करेंगे, अगर यह किसी अन्य प्रकार की बजाय डेटा एक्सेस अपवाद है।

2

सभी निबर्ननेट अपवाद गैर पुनर्प्राप्त करने योग्य नहीं हैं, यदि आप निबर्ननेट अपवादों से पुनर्प्राप्त करने का प्रयास कर रहे हैं तो आप ऐप/डेटा परत के डिज़ाइन पर फिर से जा सकते हैं। आप spring.net के exception translation implementaion पर भी एक नज़र डाल सकते हैं इसके अलावा आप अपवादों पर लेनदेन को मैन्युअल रूप से संभालने में कठोर और त्रुटि प्रवण हैं, nhibernate's contextual sessions पर एक नज़र डालें। स्प्रिंग.net में निबर्ननेट के आसपास कुछ अच्छे सहायक भी हैं।

+0

एनएचबेर्नेट के समकालीन सत्र का लिंक टूटा हुआ है। –

+0

archive.org से एनएचबर्ननेट के समापन सत्र का लिंक कार्य करना: https://web.archive.org/web/20090327153540/http://www.hibernate.org/hib_docs/nhibernate/1.2/reference/en/html/architecture.html –

1

मैं ऑब्जेक्ट को सहेजने से पहले इनपुट को मान्य करता हूं; इस तरह आप जो भी सत्यापन चाहते हैं उसे लागू कर सकते हैं (उदा। विषय कोड की लंबाई की जांच करें और साथ ही तथ्य यह भी कि कोई डुप्लिकेट नहीं है), और उपयोगकर्ता को सार्थक सत्यापन त्रुटियों को वापस पास करें।

तर्क निम्नानुसार है; असाधारण परिस्थितियों को इंगित करने के लिए अपवाद का उपयोग किया जाता है कि आपका प्रोग्राम पूरा नहीं करता है। उपरोक्त आपके उदाहरण में डुप्लिकेट विषय कोड दर्ज करने वाला कोई उपयोगकर्ता ऐसा है जो आपके प्रोग्राम को खानपान करना चाहिए; इसलिए, अपवाद को संभालने के बजाय, एक डीबी बाधा का उल्लंघन हो जाता है (जो एक असाधारण घटना है और ऐसा नहीं होना चाहिए), आप पहले उस परिदृश्य को संभालना चाहते हैं और केवल डेटा को सहेजने का प्रयास करते हैं जब आप जानते हैं कि डेटा 'बचत सही है।

आपके डीएएल में सभी सत्यापन नियमों को लागू करने का लाभ यह है कि आप यह सुनिश्चित कर सकते हैं कि आपके डीबी में जा रहा डेटा आपके व्यापार प्रक्रियाओं के अनुसार एक सतत तरीके से मान्य है, बल्कि आपके डीबी में बाधाओं को पकड़ने के बजाय तुम्हारे लिए वे

संबंधित मुद्दे