这个样品可以用来试捕吗?你们# 39;s的提议
本文关键字:你们 | 更新日期: 2023-09-27 18:08:29
这对我来说是一个悖论,我能处理所有的异常还是让它去寻找和解决它
我有一个windowservice,它有如下几个方法:
这是坏样品吗?
public void BeginOperation()
{
try
{
DoSync();
}
catch (Exception x){
Log(x.message)
Show(x.message);
}
}
public void DoSync()
{
try
{
GetSampleDatatable();
ApplyDiff();
CommitDiff();
}
catch (Exception x){
Log(x.message)
throw x;
}
}
DataLayer样本
public DataTable GetSampleDatatable()
{
OracleDataTable myDataTable;
try
{
myDataTable = new OracleDataTable(sqlStr, this);
myDataTable.FetchAll = true;
myDataTable.Active = true;
}
catch (Exception x)
{
this.ErrorMessage = x.Message;
throw x;
}
return myDataTable;
}
不,这不是一个好的做法。有几个原因可能会导致您捕获异常:
- 你可以处理它并决定如何继续
- 你想给异常添加额外的细节,让它冒泡
- 如果某些东西失败了没关系(这是非常罕见的,你可能至少想要记录它)
第一个代码块....
public void BeginOperation()
{
try
{
DoSync();
}
catch (Exception x)
{
Log(x.message)
Show(x.message);
}
}
public void DoSync()
{
try
{
GetSampleDatatable();
ApplyDiff();
CommitDiff();
}
catch (Exception x)
{
Log(x.message);
throw x;
}
}
DoSync
不属于这些类别中的任何一个。你记录了错误,但是BeginOperation
也记录了它,所以现在你有了冗余的记录。重写后,应该是这样的:
public void BeginOperation()
{
try
{
DoSync();
}
catch (Exception x)
{
Log(x.message);
Show(x.message);
}
}
public void DoSync()
{
GetSampleDatatable();
ApplyDiff();
CommitDiff();
}
事实上,我怀疑DoSync
是否必要,你可以进一步简化它。但也许你这样做是出于组织方面的原因。
public void BeginOperation()
{
try
{
GetSampleDatatable();
ApplyDiff();
CommitDiff();
}
catch (Exception x)
{
Log(x.message)
Show(x.message);
}
}
现在来看数据层。再说一次,你在这里有一些问题。你捕获了一个异常,但是你不能在这里处理它。抓住它没有任何意义。简单地让错误冒泡到可以处理的地方(BeginOperation
)。
public DataTable GetSampleDatatable()
{
OracleDataTable myDataTable = new OracleDataTable(sqlStr, this);
myDataTable.FetchAll = true;
myDataTable.Active = true;
return myDataTable;
}
另外,您正在使用throw ex;
。这不是一个好的模式。您丢失了堆栈跟踪信息,这使得在IDE中难以快速确定异常起源于何处。只需使用throw;
,它将保留堆栈跟踪信息。当然,如果您只是因为上面提到的三个原因而捕获异常,那么这种情况不应该经常发生。