2013-08-11 12 views
6

Catch(Exception) और Catch(Exception ex) के बीच क्या अंतर है। मैं मुझे उम्मीद आउटपुट दोनों देख सकते हैं। तो वास्तविक अंतर क्या है? किसकी सिफारिश की जाती है?कैच (अपवाद) और कैच (अपवाद पूर्व) के बीच अंतर

मान लीजिए कि कोड नीचे है।

int a = 1, b = 0; 
try 
{ 
    int c = a/b; 
    Console.WriteLine(c); 
} 

नीचे दिए गए कैच ब्लॉक में से कौन सा उपयोग करने की अनुशंसा की जाती है? उन लोगों के बीच वास्तविक अंतर क्या है?

catch (Exception ex) 
{ 
    Console.WriteLine(ex.Message); 
} 

या

catch (Exception) 
{ 
    Console.WriteLine("Oh NO!!"); 
} 
+0

आप क्या अपवाद आप को पकड़ने रहे हैं (जानकारी ढेर पर, संदेश आदि) में कोई दिलचस्पी नहीं कर रहे हैं अरे नहीं तो आप बस लिख सकता है 'पकड़ {Console.WriteLine (": अपवाद वर्ग साथ पैटर्न कुछ इस तरह है ");}' – Steve

+1

अंतर यह है कि आपके पास * कुछ * विचार होगा कि आपका प्रोग्राम 1 स्निपेट में सही ढंग से काम क्यों कर रहा है। दूसरे स्निपेट में कोई भी नहीं। दूसरा तरीका यह है कि SO उपयोगकर्ता ऐसे प्रश्न पूछते हैं जैसे "यह काम नहीं करता है, एक त्रुटि हुई"। बस इस तरह कोड लिखो मत। –

+1

@ स्टेव 'पकड़' और 'पकड़ (अपवाद)' के बीच एक छोटा सा अंतर है। पहले सभी अपवाद वस्तुओं को पकड़ लेंगे, दूसरा केवल 'अपवाद' से प्राप्त अपवाद वस्तुओं को पकड़ लेगा। सी # में आप केवल 'अपवाद' से प्राप्त वस्तुओं को फेंक सकते हैं, लेकिन सीएलआर अधिक समर्थन करता है। – user1908061

उत्तर

3

खैर, catch(Exception ex) बस केवल एक ही अंतर साथ catch(Exception) रूप में ही है: catch(Exception ex) में हम अपवाद वर्ग (त्रुटि के कारण) उदाहरण के लिए एक उपयोग कर सकते है।

try { 
    ... 
    } 
    catch (AppServerException e) { 
    Console.WriteLine("Application server failed to get data with the message:"); 
    Console.WriteLine(e.Message); // <- What's actually got wrong with it 
    } 

आप अपवाद वर्ग उदाहरण की जरूरत नहीं है, उदाहरण के लिए: आमतौर पर आप प्रिंट करने के लिए मूल संदेश एक अपवाद वर्ग उदाहरण की जरूरत है तुम सिर्फ अपवाद का उपभोग करने की योजना है, पकड़ (अपवाद पूर्व) वाक्य रचना अत्यधिक है और पकड़ (अपवाद) prefferable है:

try { 
    c = a/b; 
    } 
    catch (DivideByZeroException) { 
    c = Int.MaxValue; // <- in case b = 0, let c be the maximum possible int 
    } 

अंत में। बिना फिर से Throughing सामान्य अपवाद वर्ग पकड़ नहीं है:

try { 
    int c = a/b; 
    } 
    catch (Exception) { // <- Never ever do this! 
    Console.WriteLine("Oh NO!!"); 
    } 

तुम सच में कोड करने के लिए "जो कुछ त्रुटि (सीपीयू से हरा धूआं शामिल है) था सिर्फ प्रिंट आउट happend" ओह नहीं "और आगे बढ़ें" करना चाहते हैं?

tran.Start(); 

    try { 
    ... 
    tran.Commit(); 
    } 
    catch (Exception) { 
    // Whatever had happened, let's first rollback the database transaction 
    tran.Rollback(); 

    Console.WriteLine("Oh NO!"); 

    throw; // <- re-throw the exception 
    } 
+1

मैं 'अपरिवर्तनीय अपवाद वर्ग को फिर से फेंकने' के बिना असहमत हूं। और क्या आप वाकई "जो भी त्रुटि" कोड करना चाहते हैं, "ओह नहीं" और जारी रखें? '। 1।कभी-कभी मैं करता हूं 2. ऐसी कुछ चीजें हैं जिन्हें मैं करना चाहता हूं (लॉगिंग के अलावा)। कोड में 'अपवाद पूर्व' पकड़ना आम बात है। – mayu

+0

यह 'DivideByZeroException'' ZeroDivisonException' afaik नहीं है। – mayu

3

यह काफी सरल है:

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

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

2

यदि आपको catch ब्लॉक के अंदर अपवाद का उपयोग करने की आवश्यकता है, तो Exception एक नाम दें; अन्यथा, इसे अनाम रखें।

ऐसी स्थितियां हैं जब catch ब्लॉक को अपवाद के संदेश को दिखाने से अधिक करने की आवश्यकता है। उदाहरण के लिए, जब आप एप्लिकेशन-विशिष्ट अपवादों को पकड़ते हैं, तो आप अपवाद ऑब्जेक्ट के अतिरिक्त तत्वों की जांच करने में सक्षम हो सकते हैं। यहां एक काल्पनिक उदाहरण है:

catch (ConnectToServerException cse) { 
    MessageBox.Show(string.Format(
     "Connection to server '{0}' failed. Use a name from the following list: {1}" 
    , cse.AttemptedConnectionServerName 
    , string.Join(", ", cse.AllowedServerNames) 
    )); 
} 

ऊपर कोड मानता है कि कस्टम अपवाद ConnectToServerException एक संपत्ति सर्वर का नाम के साथ AttemptedConnectionServerName कहा जाता है जिससे आप कनेक्ट करने की कोशिश की है, और उपलब्ध के नाम के साथ एक गणन संपत्ति AllowedServerNames है सर्वर।

ऐसी स्थितियां भी हैं जब आपको यह जानने की आवश्यकता है कि किसी विशेष प्रकार का अपवाद अभी हुआ है। इस मामले में, आपको इसके लिए नामित चर प्रदान करने की आवश्यकता नहीं है।

0

Catch (Exception) वही काम करें, क्योंकि यह Exception प्रकार भी है।

Catch (Exception ex) सभी अपवादों को पकड़ता है और इसके अतिरिक्त आप इसके संदर्भ के माध्यम से संदेश पुनर्प्राप्त कर सकते हैं।

उपयोग आवश्यकता पर निर्भर है, यदि आप अपवाद संदेश दिखाना चाहते हैं तो आपके पास ex.Message का उपयोग करने की सुविधा है अन्यथा Catch (Exception) पर्याप्त होगा।

0
catch(Exception) साथ

आप केवल निर्दिष्ट अपवाद आप किस तरह का है कि कैच ब्लॉक में संभाल करने वाले हैं (किसी भी अपवाद है कि उठाया है, इस मामले में, तो यह सिर्फ catch के रूप में ही किया जाएगा)

catch(Exception ex) साथ

आप उठाए गए वास्तविक अपवाद का एक उदाहरण पास करें, ताकि आप अपवाद के गुणों तक पहुंच सकें और प्रदान की गई जानकारी के साथ कुछ कर सकें।

0

अंतर यह है कि कोई प्रिंट करेगा शून्य से विभाजित करने का प्रयास किया गया। और दूसरा प्रिंट करेगा ओह नहीं !!

अपवाद हैंडलिंग एक जटिल समस्या है और आवेदन पर निर्भर करता है, लेकिन यहां कुछ सामान्य टिप्पणी कर रहे हैं:


सामान्यतया यह विशिष्ट अपवाद के लिए संचालकों प्रदान करने के लिए सबसे अच्छा है:

कुछ की तरह:

catch ({System.DivideByZeroException ex) 
{ 
    Console.WriteLine("Ops. I cannot divide by zero."); 
} 
catch ({System.Exception ex) 
{ 
    Console.WriteLine("There was an error during calculations: {0}", ex.Message); 
} 

जल्द ही या बाद में आप टी पता चलेगा टोपी Console.WriteLine बस इतना अच्छा नहीं है और आपको इसे जल्द से जल्द उपयोग करने के लिए लॉगर का उपयोग करना होगा।


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

कुछ की तरह:

catch ({System.DivideByZeroException ex) 
{ 
    Console.WriteLine("Oops. I cannot divide by zero."); 
} 
catch ({System.Exception ex) 
{ 
    Console.WriteLine(GetExceptionMsgs(ex)); 
} 

...in another class... 
public static string GetExceptionMsgs(Exception ex) { 
    if(ex == null) { 
     return "No exception = no details"; 
    } 
    var sb = new StringBuilder(); 
    while(ex != null) { 
     sb.AppendLine(ex.Message); 
     ex = ex.InnerException; 
    } 
    return sb.ToString() 
} 
संबंधित मुद्दे