对我来说这是一个悖论,我可以处理所有异常,还是让它去寻找并解决它。
我有一个窗口服务,它有几个像这样的方法:
这是不好的样本吗?
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;
}
答案 0 :(得分:1)
不,这不是一个好习惯。您可能会遇到异常的原因有几个:
所以你的第一个代码块......
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;
,它将保留堆栈跟踪信息。当然,当你因为我上面提到的三个原因而只捕捉异常时,这不应该经常发生。