2012-09-26 157 views
6

我有一个try,catch和finally块的函数。如果发现异常,我会捕获该异常的某些参数,例如错误代码,错误详细信息和消息,并将其打印在Excel文件中。我下面张贴相关代码:异常不被捕获块捕获

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

的问题是,前面我有一段代码,像

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

当时,所有异常被逮住。但是,后来需求发生了变化,因为我需要捕获错误详细信息代码和错误详细信息。所以,我改变了我的catch catch(System.ServiceModel.FaultException ex),因为它允许我获取这些参数。但是现在,某些例外情况没有被捕获到。我怎样才能改变我的catch块,以便我可以捕获所有异常?

+1

那么你可以有多个catch块。 – V4Vendetta

回答

9

基本上有两种方法:

1:2个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

您可以执行下列操作之一:

  • 为每个例外您有兴趣
  • 使用提供单独的catchcatch Exception ex赶上所有,只挑那些你感兴趣的
  • 捕获exceptio族的基本异常类NS你有兴趣,如果有这样的基类(但通常没有)

一般情况下,你要么捕获所有异常(选项2),或只有那些你真的知道如何处理(选项1)

2
  • System.Exception是所有的异常types.So的母亲,当你 拥有它,将捕获任何类型的异常。
  • 但是当你知道一个特定的异常有可能在你的代码,并 有某种异常类型的catch块作为参数,则该块得到 更高的优先级高于System.Exception
+1

这是所有罪恶之母。 – Guillaume

1

所以,从你所提到的这好像你有

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

现在你可以有一个更catch块的所有其他异常 像

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

所以当一个不同的异常出现,将不会被FaultException抓来处理,而是移动到通用异常块,你可以选择来处理它,因为你需要

1

有尽可能多的catch块,对每个预期的例外。不要忘记捕捉最具体的顶部。最后赶上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. 
}