2010-08-12 18 views
7

मैं एक सी # आवेदन लिख रहा हूं जो किसी अन्य प्रोग्राम को नियंत्रित करने के लिए स्वचालन का उपयोग करता है। स्वाभाविक रूप से यह प्रोग्राम मेरे कार्यक्रम के लिए काम करने के लिए चलाना चाहिए। जब मेरा प्रोग्राम एप्लिकेशन की तलाश करता है और उसे नहीं मिल रहा है, तो मैं एक अपवाद फेंकना चाहता हूं (अब बाद में मैं एप्लिकेशन खोलने का प्रयास कर सकता हूं, या उपयोगकर्ता को इसे खोलने के लिए कह सकता हूं, या ...)।इस मामले में फेंकने का किस प्रकार का अपवाद?

क्या मुझे एक कस्टम अपवाद लागू करना चाहिए - या मौजूदा NotSupportedException (या अन्य .NET अपवादों में से एक) का उपयोग करना चाहिए। यदि एक कस्टम अपवाद है, तो आप क्या सुझाव देंगे? मैं एक कस्टम अपवाद को लागू करने के बारे में सोच रहा था, जिसे मैं इसे MyAppNameException कहूंगा और फिर यह संदेश घोषित करने के लिए संदेश का उपयोग करें कि समस्या क्या थी?

क्या अपवादों को ऐसे तरीके से फेंकने के लिए कोई सामान्य नियम हैं जो आपके प्रोग्राम को अधिक पठनीय और उपयोगकर्ता के अनुकूल बनाता है, या क्या मैं इसे बहुत अधिक विचार दे रहा हूं :)?

धन्यवाद!

उत्तर

8
  1. सबसे पहले, MyAppCustomException को एक सार आधार वर्ग के रूप में परिभाषित करें।

  2. फिर AppNotFoundCustomException के साथ इसका उत्तराधिकारी।

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

यहाँ कुछ उदाहरण कोड है कि अवधारणा को दिखाता है:

public abstract class MyAppCustomException : System.Exception 
{ 
    internal MyAppCustomException(string message) 
     : base(message) 
    { 
    } 

    internal MyAppCustomException(string message, System.Exception innerException) 
     : base(message,innerException) 
    {    
    } 
} 

public class AppNotFoundCustomException : MyAppCustomException 
{ 
    public AppNotFoundCustomException(): base("Could not find app") 
    { 
    } 
} 

और यहाँ एक ग्राहक try/catch उदाहरण है:

try 
{ 
    // Do Stuff 
} 
catch(AppNotFoundCustomException) 
{ 
    // We know how to handle this 
} 
catch(MyAppCustomException) // base class 
{ 
    // we don't know how to handle this, but we know it's a problem with our app 
} 
+0

जब 'System.Exception' से पाने, ([इसे लागू करने के तीन आम कंस्ट्रक्टर्स सिफारिश अच्छा अभ्यास है] https://msdn.microsoft.com/en-us/library/87cdya3t%28v=vs.110% 29.aspx)। उस ने कहा, प्रश्न में वर्णित स्थिति में, अपवाद फेंकना सबसे अच्छा तरीका नहीं हो सकता है। @ उत्तर] (http://stackoverflow.com/a/3471960/1497596) @ हंस पासेंट द्वारा देखें। – DavidRR

3

Framework Guidelines book है कि मैं का उपयोग इंगित करता है कि आप केवल एक कस्टम अपवाद बनाना चाहिए जब किसी भी मौजूदा अपवाद की तुलना में त्रुटि स्थिति को प्रोग्रामेटिक तरीके से अलग तरीके से संभाला जा सकता है।

अपने मामले में, यदि आप बैक-एंड इंस्टॉलेशन प्रोग्राम लॉन्च करने के लिए कस्टम अपवाद बनाना चाहते हैं, तो यह अद्वितीय है और मुझे लगता है कि एक कस्टम अपवाद ठीक होगा।

अन्यथा, System.Runtime.InteropServices.ExternalException विरासत से कुछ उचित हो सकता है।

+0

+1 केवल कस्टम अपवाद बनाने के लिए यदि आप उन्हें कस्टम तरीके से संभालने की योजना बनाते हैं। यदि आप वास्तव में बताई गई स्थिति में प्रोग्रामेटिक रूप से कुछ कर सकते हैं, तो मैं पोस्टमैन के सुझाव के साथ जाऊंगा। – jloubert

1

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

बेशक, यदि आप वास्तव में उस प्रोग्राम को शुरू करते हैं तो यह उपयोगकर्ता के लिए अधिक उपयोगी हो सकता है यदि आपको लगता है कि यह नहीं चल रहा है।

+0

+1 मैं सहमत हूं, वास्तव में इस मामले में अपवाद कितना अच्छा होगा। इसमें 0 मान है। – JonH

0

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

करीब से मैच कुछ InvalidOperationException, जहां एक सदस्य इस्तेमाल किया जा सकता है, लेकिन वर्तमान स्थिति नहीं दिया है।

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

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