2012-09-26 8 views
6

try、catch、finallyブロックの関数があります。例外がキャッチされた場合、そのエラーコード、エラーの詳細メッセージ、およびメッセージなどのその例外の特定のパラメータをキャッチし、それをExcelファイルに出力します。下記の関連するコードを掲載しています:問題は、以前の私はその時catchブロックに例外がキャッチされない

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

、すべての例外は捕まるました。しかし、後で、エラー詳細コードとエラー詳細メッセージを取得する必要があるため、要件が変更されました。だから、キャッチブロック(catch)(System.ServiceModel.FaultException ex)を変更しました。私はそれらのパラメタを取得することができました。しかし、現在では、特定の例外がキャッチブロックに捕捉されていません。どのように私はすべての例外を捕まえることができるようにキャッチブロックを変更することができますか?

+1

まあ、複数のキャッチブロックを持つことができます。 – V4Vendetta

答えて

9

は基本的に2つの方法があります。

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:1 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の中によくあることをたくさんしたいのであれば、2番目に利点があるかもしれません。

3

..あなたは、あなたが次のいずれかを行うことができ、複数の

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

を持つことができ、他のキャッチエリアを追加します。

  • あなたは
  • 使用に興味がある例外ごとに別々のcatchブロックを提供catch Exception exすべてをキャッチし、興味のあるものだけを選択
  • exceptioの家族の基本例外クラスをキャッチするそのような基底クラスがある場合には興味があります(通常はありません)

一般に、すべての例外(オプション2)、または実際に処理する方法オプション1)

2
  • System.Exceptionは、あなたが、それを持って 例外のいずれかの種類をキャッチするすべての例外types.Soの母です。パラメータは、そのブロックは、だから、あなたはそれを言及したものからSystem.Exception
+1

それはすべての罪の母です。 – Guillaume

1

上 高い優先度を得るよう

  • しかし、あなたが知っているとき、特定の例外は、コード内で可能であり、 は、その例外タイプとcatchブロックを持っていますあなたは

    などの他のすべての例外 のためにもう一つのcatchブロックを持つことができ、あなたが今

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

    を持っているように思えます別の例外が発生したとき

    ので、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. 
    } 
    
    関連する問題