2012-09-26 24 views
6

Ho una funzione con try, catch e finally block. Se viene rilevata un'eccezione, prendo alcuni parametri di tale eccezione come il suo codice di errore, il messaggio di errore e il messaggio e lo stampano in un file Excel. Metto il codice specifico in basso:Eccezione nel blocco catch

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(); 
     } 

Il problema è, in precedenza ho avuto un pezzo di codice come

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

A quel tempo, tutte le eccezioni è stato essere scoperti. Ma, in seguito, il requisito è stato modificato in quanto era necessario acquisire anche il codice di dettaglio dell'errore e il messaggio di dettaglio dell'errore. Così, ho cambiato il mio blocco catch con catch (System.ServiceModel.FaultException ex) in quanto mi ha permesso di recuperare quei parametri. Ma ora, certe eccezioni non vengono intrappolate nel blocco delle catture. Come posso modificare il blocco catch in modo da poter rilevare tutte le eccezioni?

+1

Bene, è possibile avere più blocchi di cattura. – V4Vendetta

risposta

9

Vi sono fondamentalmente due modi:

1: due catch blocchi (più specifico primo):

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

2: uno catch blocco con un test:

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 
} 

O può funzionare. Il primo è forse più pulito, ma se vuoi fare un sacco di cose comuni all'interno del catch il secondo potrebbe avere dei vantaggi.

3

Aggiungere un'altra zona di cattura .. è possibile avere più

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

È possibile effettuare una delle operazioni seguenti:

  • forniscono catch blocco separato per ciascuna eccezione siete interessati a
  • uso catch Exception ex per catturare tutto e selezionare solo quelli che ti interessano
  • catturare la classe di eccezione di base della famiglia di eccezioni ns sei interessato a, se c'è una tale classe base (ma di solito non c'è)

In generale, puoi prendere tutte le eccezioni (opzione 2), o solo quelle che sai davvero come gestire (opzione 1)

2
  • System.Exception è la madre di tutti types.So eccezione quando si avete, si cattura qualsiasi tipo di eccezione.
  • Ma quando si sa un'eccezione specifica è possibile nel codice e hanno un blocco catch con quel tipo di eccezione come parametro, allora quel blocco ottiene precedenza sulla System.Exception
+1

È la madre di tutti i peccati. – Guillaume

1

Quindi, da quello che dicono che sembra come avete

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

Ora è possibile avere più un blocco di cattura per tutte le altre eccezioni come

catch(Exception all){// you may log} 

così quando un'eccezione diversa si pone non sarebbe gestita dal FaultException cattura ma invece muoversi nel blocco di eccezione generica e si può scegliere di elaborarla come avete bisogno

1

Avere blocchi catch tanto, per ciascuno di le eccezioni attese. Non dimenticare di prendere i più specifici in cima. Alla fine prendi la classe Exception per catturare una delle restanti eccezioni.

Se si cattura lo Exception in cima, per qualsiasi eccezione, questo blocco verrà attivato e tutti gli altri blocchi saranno irraggiungibili.

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

} 
catch (SecondSpecificException ex) 
{ 

} 
catch (NthSpecificExceptoin ex) 
{ 

} 
catch (Exception ex) 
{ 
    // in case you might have missed anything specifc. 
} 
Problemi correlati