2012-09-26 18 views
6

Tengo una función con try, catch y finally block. Si se detecta una excepción, entonces capturo ciertos parámetros de esa excepción, como su código de error, mensaje de error y mensaje, e imprimo en un archivo de Excel. De Publicación código correspondiente a continuación:Excepción no quedar atrapado en el bloque 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(); 
     } 

El problema es, antes que estaba teniendo un pedazo de código como

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

En ese momento, todas las excepciones se queden atrapados. Pero, más tarde, el requisito cambió, ya que necesitaba capturar el código de detalle de error y el mensaje de error. Entonces, cambié mi catch block por catch (System.ServiceModel.FaultException ex) ya que me permitió buscar esos parámetros. Pero ahora, ciertas excepciones no quedan atrapadas en el bloque catch. ¿Cómo puedo cambiar mi bloque catch para que pueda detectar todas las excepciones?

+1

Bueno, puede tener varios bloques catch. – V4Vendetta

Respuesta

9

Hay básicamente dos maneras:

1: catch dos bloques (la más específica primera):

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 bloque con una prueba:

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 cualquiera puede funcionar. El primero es quizás más limpio, pero si quiere hacer muchas cosas comunes dentro del catch, el segundo podría tener ventajas.

3

Añadir otra zona de captura .. Puede tener múltiples

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

Usted puede hacer una de las siguientes:

  • proporcionan bloque separado para cada excepción catch usted está interesado en
  • uso catch Exception ex para atrapar todo y elegir solo aquellos que le interesan
  • tomar la clase de excepción base de la familia de exceptio ns le interesa, si existe tal clase base (pero generalmente no existe)

En general, puede detectar todas las excepciones (opción 2), o solo aquellas que realmente sabe cómo manejar (opción 1)

2
  • System.Exception es la madre de todos types.So excepción cuando lo tiene, se captura ningún tipo de excepción.
  • Pero cuando se conoce una excepción específica es posible en el código y tienen un bloque catch con ese tipo de excepción como parámetro, ese bloque se una mayor prioridad sobre System.Exception
+1

Es la madre de todos los pecados. – Guillaume

1

Así que de lo que lo mencionas parece que tienes

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

Ahora usted puede tener una más bloque catch para todas las demás excepciones como

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

así que cuando surge no sería manejada por el retén FaultException sino que se mueven en el bloque de excepción genérica y se puede elegir para procesarlo como sea necesario

1

tienen tanto bloques catch, para cada uno de una excepción diferente las excepciones esperadas. No te olvides de atrapar los más específicos en la parte superior. Finalmente, tome la clase Exception para captar cualquiera de las excepciones restantes.

Si se coge el Exception en la parte superior, para cualquier excepción, este bloque se disparará y el resto de los bloques será inalcanzable.

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

} 
catch (SecondSpecificException ex) 
{ 

} 
catch (NthSpecificExceptoin ex) 
{ 

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