6

try、catch、finallyblockの機能があります。例外がキャッチされた場合、エラーコード、エラー詳細メッセージ、メッセージなど、その例外の特定のパラメーターをキャッチし、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ブロックを変更するにはどうすればよいですか?

4

6 に答える 6

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:catchテスト付きの1つのブロック:

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利点があるかもしれません。

于 2012-09-26T07:05:07.063 に答える
3

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

try
{
  // stuff
}
catch (Exception1 ex}
{
  // 1 type of exception
}
catch (Exception e)
  // catch whats left
}
于 2012-09-26T07:04:18.287 に答える
2
  • System.Exceptionはすべての例外タイプの母です。したがって、それがあると、あらゆる種類の例外がキャッチされます。
  • ただし、コードで特定の例外が発生する可能性があることがわかっていて、その例外タイプをパラメーターとして持つcatchブロックがある場合、そのブロックはより高い優先度を取得します。System.Exception
于 2012-09-26T07:06:00.547 に答える
1

だからあなたが言ったことからそれはあなたが持っているようです

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

これで、次のような他のすべての例外に対してもう1つのcatchブロックを持つことができます。

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

したがって、別の例外が発生した場合、それはFaultExceptioncatchによって処理されず、代わりに一般的な例外ブロックに移動し、必要に応じて処理することを選択できます。

于 2012-09-26T07:06:49.993 に答える
1

次のいずれかを実行できます。

  • catch関心のある例外ごとに個別のブロックを提供します
  • catch Exception exすべてをキャッチし、興味のあるものだけを選ぶために使用します
  • そのような基本クラスがある場合は、関心のある例外ファミリーの基本例外クラスをキャッチします(ただし、通常はありません)

一般に、すべての例外をキャッチするか(オプション2)、または実際に処理方法を知っている例外のみをキャッチします(オプション1)。

于 2012-09-26T07:04:27.660 に答える
1

予想される例外ごとに、できるだけ多くのキャッチブロックを用意します。最も具体的なものを上にキャッチすることを忘れないでください。最後に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.
}
于 2012-09-26T07:16:03.397 に答える