我有一个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(System.ServiceModel.FaultException ex)改变了我的catch块,因为它允许我获取那些参数。但是现在,某些例外情况并没有被捕获。如何更改我的catch块以便能够捕获所有异常?
答案 0 :(得分:9)
基本上有两种方式:
1:两个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
内做很多常见的事情,第二个可能有优势。
答案 1 :(得分:3)
添加另一个捕获区域..您可以有多个
try
{
// stuff
}
catch (Exception1 ex}
{
// 1 type of exception
}
catch (Exception e)
// catch whats left
}
答案 2 :(得分:2)
System.Exception
是所有异常类型的母亲。所以当你
拥有它,会遇到任何异常。System.Exception
答案 3 :(得分:1)
您可以执行以下操作之一:
catch
块catch Exception ex
来抓住所有人,只选择您感兴趣的人一般情况下,您要么捕获所有异常(选项2),要么只捕获您真正知道如何处理的异常(选项1)
答案 4 :(得分:1)
所以从你提到的内容来看,似乎你有
try{}
catch(FaultException ex){ExcelRecorder(ex.Message,[other params]);}
现在,您可以为所有其他异常添加一个catch块 像
catch(Exception all){// you may log}
所以当出现不同的异常时,它不会被FaultException
catch处理,而是进入通用异常块,你可以根据需要选择处理它
答案 5 :(得分: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.
}