2010-02-18 14 views
20

here पोस्ट किए गए एक प्रश्न को पहले से ही एक ही प्रश्न दिया गया है जो बहुत ही समान है (या गिरने के साथ)। मेरा सवाल उस प्रश्न को थोड़ा और बढ़ा रहा है। मान लें कि आप कई प्रकार के अपवाद को पकड़ना चाहते हैं लेकिन इसे उसी तरह से संभालना चाहते हैं, क्या स्विच केस जैसे कुछ करने का कोई तरीका है?कोशिश करें।

switch (case) 
{ 
    case 1: 
    case 2: 

    DoSomething(); 
    break; 
    case 3: 
    DoSomethingElse() 
    break; 

} 

यह संभव कुछ अपवादों को छोड़कर एक ही तरह से संभाल करने के लिए है। कुछ

try 
{ 
} 
catch (CustomException ce) 
catch (AnotherCustomException ce) 
{ 
    //basically do the same thing for these 2 kinds of exception 
    LogException(); 
} 
catch (SomeOtherException ex) 
{ 
//Do Something else 
} 
+0

संभावित डुप्लिकेट [एक बार में कई अपवादों को पकड़ें?] (Http://stackoverflow.com/questions/136035/catch-multiple-exceptions-at-once) – nawfal

उत्तर

15

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

वैकल्पिक रूप से आप के रूप में इस सवाल में विस्तार से बताया है सकता है:

Catch multiple Exceptions at once?

व्यक्तिगत तौर पर मैं विधि-आधारित दृष्टिकोण पसंद करते हैं।

+2

डेटा को इस धागे में कॉपी करने के लिए: 'पकड़ (अपवाद पूर्व) { अगर (पूर्व स्वरूप स्वरूप है || पूर्व ओवरफ्लो एक्सेप्शन है) { वेबआईडी = Guid.Empty; वापसी; } फेंक; } ' –

7

आपको वास्तव में बेसकैस्ट अपवाद होना चाहिए और उसे पकड़ना चाहिए।

0

आपको इन कस्टम अपवादों को नहीं पकड़ना चाहिए, हालांकि यदि आप चाहते हैं कि आप एक आम BaseException बना सकें और उसे पकड़ सकें।

+0

क्यों नहीं? कोशिश पकड़ ब्लॉक के भीतर प्रभावी रूप से 3 कस्टम पुस्तकालय हो सकते हैं। – Gusdor

+0

आप सही हैं, सामान्य रूप से आपको जितनी जरूरत हो उतनी कस्टम अपवादों को पकड़ने के लिए बिल्कुल ठीक है, वास्तव में इसकी पसंदीदा, यदि आप उन्हें अलग-अलग संभालते हैं। –

-5

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

try 
{ 
} 
catch (System.Object obj) 
{ 
    Type type; 

    type = obj.GetType() ; 
    if (type == CustomException || type == AnotherCustomException) 
    { 
    //basically do the same thing for these 2 kinds of exception 
    LogException(); 
    } 
    else if (type == SomeOtherException ex) 
    { 
    //Do Something else 
    } 
    else 
    { 
    // Wasn't an exception to handle here 
    throw obj; 
    } 
} 
+0

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

+0

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

+2

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

1

vb.net में, कोई अपवाद फ़िल्टर का उपयोग करने के लिए उपयोग कर सकता है, उदा।

 
    Catch Ex As Exception When TypeOf Ex is ThisException Or TypeOf Ex is ThatException 

दुर्भाग्य से, जो कुछ कारणों के लिए, सी # का कार्यान्वयन करने वालों के रूप में अभी तक अपवाद छानने कोड सी # के भीतर लिखने की अनुमति देने से इनकार कर दिया है।

3

यह copied from another posting है, लेकिन मैं इस सूत्र के लिए कोड खींच कर रहा हूँ:

पकड़ने System.Exception और प्रकार

catch (Exception ex)    
{     
    if (ex is FormatException || ex is OverflowException) 
    { 
     WebId = Guid.Empty; 
     return; 
    } 

    throw; 
} 

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

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