大家都喜欢使用MS提供的try...catch...finally,这的确给C#开发者带来的福音,以往Delphi开发者,往往会在嵌套使用try ...finally..end,try..except ..end达到相同的效果。但在某些场合下使用确实是有差别的。我们来看一个例子:
Broker broker = new Broker();
try
{
broker.Open();
//处理判断逻辑
//end
broker.BeginTrans();
//处理事务
//end
broker.CommitTrans();
}
catch(Exception ex)
{
broker.RollbackTrans();
throw ex;
}
finally
{
broker.Close();
}
如果在判断逻辑中出现异常,显然在catch 中broker需要Roolback,这时候就有问题了,broker还没有启Trans怎么就回滚了呢。所以应改为如下try
{
broker.Open();
//处理判断逻辑
//end
broker.BeginTrans();
//处理事务
//end
broker.CommitTrans();
}
catch(Exception ex)
{
broker.RollbackTrans();
throw ex;
}
finally
{
broker.Close();
}
Broker broker = new Broker();
try
{
broker.Open();
//处理判断逻辑
//end
try
{
broker.BeginTrans();
//处理事务
//end
broker.CommitTrans();
}
catch(Exception ex)
{
broker.RollbackTrans();
throw ex;
}
}
finally
{
broker.Close();
}
try
{
broker.Open();
//处理判断逻辑
//end
try
{
broker.BeginTrans();
//处理事务
//end
broker.CommitTrans();
}
catch(Exception ex)
{
broker.RollbackTrans();
throw ex;
}
}
finally
{
broker.Close();
}
判断逻辑有异常被调用此方法的catch中处理,当然自己也可以catch异常。这个也等同于Delphi中的处理
try
conn.open();
//处理逻辑
try
conn.BeginTrans();
//处理事务
conn.CommitTrans();
exception
conn.RollBackTrans();
end
finally
conn.close();
end