2012-09-26 158 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. 
}