2010-04-22 20 views
9

मेरे पास एक सम्मिलित क्वेरी है जो एक int लौटाती है। उस int के आधार पर मैं अपवाद फेंकना चाहता हूं। क्या यह एक स्विच स्टेटमेंट के भीतर करना उचित है?क्या आप सी # स्विच स्टेटमेंट में अपवाद फेंक सकते हैं?

switch (result) 
     { 

      case D_USER_NOT_FOUND: 
       throw new ClientException(string.Format("D User Name: {0} , was not found.", dTbx.Text)); 
      case C_USER_NOT_FOUND: 
       throw new ClientException(string.Format("C User Name: {0} , was not found.", cTbx.Text)); 
      case D_USER_ALREADY_MAPPED: 
       throw new ClientException(string.Format("D User Name: {0} , is already mapped.", dTbx.Text)); 
      case C_USER_ALREADY_MAPPED: 
       throw new ClientException(string.Format("C User Name: {0} , is already mapped.", cTbx.Text)); 
      default: 

       break; 
     } 

मैं आमतौर पर स्विच करने के लिए ब्रेक स्टेटमेंट जोड़ता हूं लेकिन उन्हें हिट नहीं किया जाएगा। क्या यह एक खराब डिजाइन है? कृपया मेरे साथ कोई राय/सुझाव साझा करें।

धन्यवाद, ~ सैन डिएगो

+2

ऐसा लगता है कि आप अपवादों पर रिटर्न कोड मैप करने का प्रयास कर रहे हैं। आपका इरादा स्पष्ट है इसलिए मैं कहूंगा कि यह समाधान ठीक है। –

उत्तर

3

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

मुझे लगता है कि आपकी "सम्मिलित क्वेरी" संग्रहित प्रो का कुछ रूप है।

+0

हां महोदय आप सही हैं। धन्यवाद। – Hcabnettek

0

मुझे लगता है कि यह ठीक है। ऐसा लगता है कि आप स्विच स्टेटमेंट का उपयोग करके अपवाद में रिटर्न कोड मैप कर रहे हैं। जब तक बहुत सारे मामले नहीं हैं, यह कोई समस्या नहीं है।

1

यदि संभव हो तो संभवतः बेहतर होगा यदि आप असफल परिणाम सेट करते हैं, अन्यथा आप परिणाम जांच और फेंकने के साथ समाप्त होते हैं। लेकिन निश्चित रूप से संभव नहीं हो सकता है।

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

4

कोई समस्या नहीं ... यह खराब डिज़ाइन क्यों होगा?

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

static private Dictionary<int, string> errorMessages; 
static 
{ 
    // create and fill the Dictionary 
} 

// meanwhile, elsewhere in the code... 
if (result is not ok) { 
    throw new ClientException(string.Format(errorMessages[result], cTbx.Text, dTbx.Text)); 
} 

संदेशों खुद को में, आप {0}, {1} साथ उचित पैरामीटर, आदि

0

दृष्टिकोण आप ले रहे हैं के साथ गलत कुछ भी नहीं है चुन सकते हैं। स्विच कथन यदि/तो कथन (और संभावित रूप से तेज़) से पढ़ने के लिए बहुत आसान हैं। दूसरी चीज जो आप कर सकते हैं

Dictionary<Result_Type, Exception> 

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

+0

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

+0

हाँ, इसके लिए एक शब्दकोश का उपयोग करने का सबसे अच्छा उदाहरण नहीं है। यदि कुछ भी आपको अपवाद प्रकार को संग्रहीत करने की आवश्यकता होगी, न कि वास्तविक अपवाद स्वयं। – kemiller2002

+0

दुर्भाग्यवश, अपवाद प्रकार को संग्रहीत करना बहुत उपयोगी नहीं है, क्योंकि जब तक कि कोई प्रतिबिंब (अपवाद के संदर्भ में कुछ हद तक डोजी प्रीपोजिशन) का उपयोग नहीं करता है, तो अपवाद प्रकार देने के लिए कोई सामान्य तरीका नहीं है, अपवाद उत्पन्न करता है उस प्रकार। – supercat

12

क्यों नहीं?

से सी # प्रोग्रामिंग भाषा, तीसरा संस्करण। एंडर्स हेल्स्बर्ग एट अल, पेज द्वारा 362:

एक स्विच अनुभाग के बयान सूची आम तौर पर एक break, goto case, या goto default बयान में समाप्त हो जाती है, लेकिन किसी भी निर्माण कि बयान सूची नहीं पहुंचा जा सकता का अंतिम बिंदु renders की अनुमति दी है । [...] इसी प्रकार, throw या return कथन हमेशा कहीं और नियंत्रण स्थानांतरित करता है और कभी भी इसके अंतिम बिंदु तक नहीं पहुंचता है।इस प्रकार निम्न उदाहरण मान्य है:

switch(i) { 
case 0: 
    while(true) F(); 
case 1: 
    throw new ArgumentException(); 
case 2: 
    return; 
} 
0

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

मजबूत विचार यह होना चाहिए कि अपवाद स्वयं उपयुक्त हैं या नहीं। आम तौर पर, अपवादों का उपयोग तभी किया जाना चाहिए जब एक स्थिति उत्पन्न होती है जो अपेक्षित व्यवहार की सीमा से बाहर होती है। अपवादों को कार्यक्रम प्रवाह तर्क के रूप में उपयोग नहीं किया जाना चाहिए। आपके मामले में आप देखे गए कोड के आधार पर उनका उपयोग करना ठीक है।

0

शायद मैं इसके बजाय कोड में स्विच करने के लिए होने के सभी प्रश्नों के उत्तर यहाँ से अलग करने के ..

भीख माँगती हूँ, मैं नहीं बल्कि ClientException वर्ग के लिए result में से होकर गुजरेगा & यह तय करें कि स्ट्रिंग यह दिखाने के लिए की जरूरत है चलो बल्कि तो विभिन्न संदेशों

बनाने के लिए हर जगह एक बदसूरत स्विच है

मेरे कोड दिखाई देगा:

throw new ClientException(result, cTbx.Text); 

तो, भले ही आपमें त्रुटियों फेंक कर सकते हैं, आप इसे से बच सकते हैं मेरे सभी

+1

किस बिंदु पर क्लाइंटएक्सप्शन कन्स्ट्रक्टर के पास एक ही स्विच तर्क होगा, लेकिन इसे तोड़ना होगा। – Yishai

+0

या एक ... अन्य :) – Sunny

+0

मैं डाउनवॉटेड क्योंकि यह "समाधान" बस समस्या को बदल देता है। इससे कोई वास्तविक अंतर नहीं आता है। –

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