2012-09-18 18 views
5

टीपीएल कार्यों में अपवादों को संभालने पर मैं अपवादों को संभालने के दो तरीकों से आया हूं। पहला काम के भीतर अपवाद पकड़ता और इतने की तरह परिणाम के भीतर इसे रिटर्न:कार्य समांतर लाइब्रेरी अपवाद हैंडलिंग

var task = Task<Exception>.Factory.StartNew(
    () => 
     { 
      try 
      { 
       // Do Something 

       return null; 
      } 
      catch (System.Exception e) 
      { 
       return e; 
      } 
     }); 

task.ContinueWith(
    r => 
     { 
      if (r.Result != null) 
      { 
       // Handle Exception 
      } 
     }); 

दूसरा प्रलेखन के भीतर दिखाया एक है और मैं उचित तरीके से काम करने के लिए लगता है:

var task = Task.Factory.StartNew(
    () => 
     { 
      // Do Something 
     }); 
task.ContinueWith(
    r => 
     { 
      if (r.Exception != null) 
      { 
       // Handle Aggregate Exception 
       r.Exception.Handle(y => true); 
      } 
     }); 

मैं सोच रहा हूं कि पहले दृष्टिकोण के साथ कुछ गलत है या नहीं? मुझे इस तकनीक का उपयोग करके हर बार और फिर से 'अनचाहे कुल अपवाद' अपवाद प्राप्त हुए हैं और यह सोच रहा था कि यह कैसे हो सकता है?

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

+0

मेरे पास एक ही समस्या थी, हालांकि मैंने कार्य के साथ जांच की थी। मैंने पाया कि अगर यह कार्य के दौरान अपवाद था, भले ही मैंने पहली चीज की जांच की थी, और इसे नोट किया और छोड़ दिया, यह अभी भी मुद्दों का कारण .. और मुझे एक अपवाद मिला जो बाहर नहीं होना चाहिए .. – BugFinder

उत्तर

3

पहला दृष्टिकोण मानता है कि प्रत्येक आमंत्रण के लिए अपवाद उठाए जाएंगे। हालांकि यह सच हो सकता है, अपवाद "असाधारण" और एक डिजाइन मुद्दे की गंध नहीं लगते हैं। यदि अपवाद असाधारण नहीं हैं, तो परिणाम अधिक समझ में नहीं आता है। दूसरी समस्या यह है कि यदि आप "परिणाम" चाहते हैं (यानी Exception के अलावा कुछ और) आप ऐसा नहीं कर सकते क्योंकि Exception के लिए एक और केवल Result स्लॉट का उपयोग किया जाता है। एक और समस्या यह है कि आपको मुख्य धागे पर अपवाद की पुनः फेंकना नहीं मिलता है (आप इसे मैन्युअल रूप से कर सकते हैं) ताकि आपको कैच अर्थशास्त्र नहीं मिले (यानी आप Handle विधि का उपयोग कर रहे हैं)।

दूसरी विधि अधिक लोगों द्वारा बेहतर ढंग से समझा जाएगा।

+0

आपकी टिप्पणियों के लिए धन्यवाद। मैं इस दृष्टिकोण का उपयोग एक भंडार के भीतर कर रहा हूं जहां अपवादों की अपेक्षा की जाती है (डेटाबेस पहुंच)। यदि मुझे परिणाम लौटाया गया है तो मेरे पास एक रिपोजिटरी रिसेट क्लास है जिसे कार्य द्वारा वापस किया जा सकता है और परिणाम और अपवाद शामिल है। कार्य निरंतरता है जहां अपवाद हैंडलिंग हो रही है (यानी अपवाद हैंडलिंग सेवा पर कॉल करें)। मैं वास्तव में क्या सोच रहा हूं कि मैं पहले दृष्टिकोण के साथ एक अनचाहे कुल अपवाद के साथ कैसे समाप्त कर सकता हूं? – user1680766

+0

तो, आप अपवादों से निपटने के असंगत तरीके होंगे। न कि 'कार्य' के पास 'संपत्ति ' के साथ एक परिणाम है, जिसके परिणामस्वरूप परिणाम संपत्ति की कमी है, लेकिन पहले से ही 'कार्य। अपवाद' संपत्ति के साथ-साथ 'ISFaulted' ... –

+0

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

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