C# 这个样品是不是很好用的样品?什么';什么建议?
这对我来说是一个悖论,我能处理所有的异常还是让它去发现并解决它 我有一个WindowsService,它有以下几种方法:C# 这个样品是不是很好用的样品?什么';什么建议?,c#,asp.net,exception,coding-style,C#,Asp.net,Exception,Coding Style,这对我来说是一个悖论,我能处理所有的异常还是让它去发现并解决它 我有一个WindowsService,它有以下几种方法: public void BeginOperation() { try { DoSync(); } catch (Exception x) { Log(x.message); Show(x.message); } } public void DoSync()
public void BeginOperation()
{
try
{
DoSync();
}
catch (Exception x)
{
Log(x.message);
Show(x.message);
}
}
public void DoSync()
{
GetSampleDatatable();
ApplyDiff();
CommitDiff();
}
这是坏样品吗
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;
}
}
数据层示例
不,这不是一个好的做法。您可能会捕获异常的原因有:
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
不属于这些类别。您正在记录错误,但是开始操作
也会记录错误,因此现在您有了冗余的日志记录。重写后,应该是这样的:
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
)
此外,您正在使用
throw-ex代码>。这不是一个好模式。您会丢失堆栈跟踪信息,这使得IDE很难快速确定异常的来源。只需使用throw代码>,它将保留堆栈跟踪信息。当然,当您仅仅因为我上面提到的三个原因而捕获异常时,这种情况不应该经常发生。您在这里遇到的最大问题是,您一直都在捕获所有异常,只需使用捕获异常
。仔细想想哪些异常可能会发生,然后就可以清楚地知道在哪里可以捕捉到哪些异常(如果捕捉到它们的话)。我知道,对于这个示例,什么是处理异常的最佳方法,你能简单地说一下吗代码>这会弄乱堆栈跟踪!只需使用throw代码>。这里有一点很重要:只有在您能够处理异常时才能捕获它。如果你不能处理这个问题,那就不要在那里抓住它。让它变成可以的东西吧。谢谢@mason的回复
public DataTable GetSampleDatatable()
{
OracleDataTable myDataTable = new OracleDataTable(sqlStr, this);
myDataTable.FetchAll = true;
myDataTable.Active = true;
return myDataTable;
}