2012-09-26 13 views
6

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

catch(Exception ex) 
{ 
ExcelRecorder(ex.Message); 
} 

public void UpdateGroup(String strSiteID, String strGroup, int row) 
     { 
      try 
      { 
       Console.WriteLine("UpdateGroup"); 
       Excel1.MWMClient.MWMServiceProxy.Group group = new Excel1.MWMClient.MWMServiceProxy.Group(); 
       group.name = "plumber"; 
       group.description = "he is a plumber"; 
       Console.WriteLine(groupClient.UpdateGroup(strSiteID,group)); 
       ExcelRecorder(0, null, null, row); 
      } 
      catch (System.ServiceModel.FaultException<DefaultFaultContract> ex) 
      { 
       ExcelRecorder(ex.Detail.ErrorCode, ex.Detail.Message, ex.Message, row); 
      } 
      finally 
      { 
       System.GC.Collect(); 
      } 
     } 



public void ExcelRecorder(int error, string detailmessage, string message, int row) 
     { 
      Excel.Application xlApp = new Excel.Application();    
      Excel.Workbook xlWorkbook = xlApp.Workbooks.Open(@"D:/WebServiceTestCases_Output.xlsx"); 
      Excel._Worksheet xlWorksheet = xlWorkbook.Sheets[1]; 
      Excel.Range xlRange = xlWorksheet.UsedRange;   
       if (!string.IsNullOrEmpty(message)) 
       { 
        ((Range)xlWorksheet.Cells[row, "M"]).Value2 = "FAIL"; 
        ((Range)xlWorksheet.Cells[row, "N"]).Value2 = error; 
        ((Range)xlWorksheet.Cells[row, "O"]).Value2 = detailmessage; 
        ((Range)xlWorksheet.Cells[row, "P"]).Value2 = message; 
       } 
       else 
       { 
        ((Range)xlWorksheet.Cells[row, "M"]).Value2 = "PASS"; 
        ((Range)xlWorksheet.Cells[row, "N"]).Value2 = ""; 
        ((Range)xlWorksheet.Cells[row, "O"]).Value2 = ""; 
        ((Range)xlWorksheet.Cells[row, "P"]).Value2 = ""; 
       } 
      xlWorkbook.Save(); 
      xlWorkbook.Close(0,0,0); 
      xlApp.Quit(); 
     } 

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

+1

ठीक है आप कई पकड़ ब्लॉक प्राप्त कर सकते हैं। – V4Vendetta

उत्तर

9

मूल रूप से दो तरीके हैं:

1: दो catch ब्लॉक (सबसे सटीक पहले):

catch (System.ServiceModel.FaultException<DefaultFaultContract> ex) 
{ 
    ExcelRecorder(ex.Detail.ErrorCode, ex.Detail.Message, ex.Message, row); 
} 
catch (Exception ex) 
{ 
    // TODO: simpler error handler 
} 

2: एक catch परीक्षण के साथ ब्लॉक:

catch (Exception ex) 
{ 
    var fault = ex as System.ServiceModel.FaultException<DefaultFaultContract>; 
    if(fault != null) 
    { 
     ExcelRecorder(fault.Detail.ErrorCode, fault.Detail.Message, 
      fault.Message, row); 
    } 
    // TODO: common error handling steps 
} 

या तो काम कर सकता है। पहला शायद क्लीनर है, लेकिन यदि आप catch के अंदर बहुत सी सामान्य चीजें करना चाहते हैं तो दूसरे के पास फायदे हो सकते हैं।

3

एक और कैच क्षेत्र जोड़े .. आप कर सकते हैं कई

try 
{ 
    // stuff 
} 
catch (Exception1 ex} 
{ 
    // 1 type of exception 
} 
catch (Exception e) 
    // catch whats left 
} 
1

आप निम्न में से एक कर सकते हैं:

  • प्रत्येक अपवाद आप में
  • उपयोग रुचि रखते हैं के लिए अलग catch ब्लॉक प्रदान catch Exception ex सभी को पकड़ने के लिए और केवल उन लोगों को चुनें जिन्हें आप रुचि रखते हैं
  • छोड़कर परिवार के मूल अपवाद वर्ग को पकड़ें एनएस में रुचि है, यदि ऐसी बेस क्लास है (लेकिन आमतौर पर नहीं है)

सामान्यतः, आप या तो सभी अपवाद (विकल्प 2) पकड़ते हैं, या केवल वे जिन्हें आप वास्तव में कैसे संभालना चाहते हैं (विकल्प 1)

2
  • System.Exception जब तुम्हारे पास है , अपवाद के किसी भी प्रकार पकड़ेगा सभी अपवाद types.So की जननी है।
  • लेकिन जब आप जानते हैं कि एक विशिष्ट अपवाद अपने कोड में संभव है और के रूप में पैरामीटर, तो उस ब्लॉक एक उच्च प्राथमिकता तो तुम यह क्या उल्लेख से हो जाता है System.Exception
+1

यह सभी पापों की मां है। – Guillaume

1

से अधिक है कि अपवाद प्रकार के साथ एक कैच ब्लॉक है लगता है आपके पास है

try{} 
catch(FaultException ex){ExcelRecorder(ex.Message,[other params]);} 

अब आप

जैसे अन्य सभी अपवादों के लिए एक और कैच ब्लॉक हो सकता है

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

1

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

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

try 
{ 
    // your code here 
} 
catch (FirstSpecificException ex) 
{ 

} 
catch (SecondSpecificException ex) 
{ 

} 
catch (NthSpecificExceptoin ex) 
{ 

} 
catch (Exception ex) 
{ 
    // in case you might have missed anything specifc. 
} 
संबंधित मुद्दे