嗨,什么是最好的方式做嵌套的try&最后在delphi语句中?
var cds1 : TClientDataSet;
cds2 : TClientDataSet;
cds3 : TClientDataSet;
cds4 : TClientDataSet;
begin
cds1 := TClientDataSet.Create(application );
try
cds2 := TClientDataSet.Create(application );
try
cds3 := TClientDataSet.Create(application );
try
cds4 := TClientDataSet.Create(application );
try
///////////////////////////////////////////////////////////////////////
/// DO WHAT NEEDS TO BE DONE
///////////////////////////////////////////////////////////////////////
finally
cds4.free;
end;
finally
cds3.free;
end;
finally
cds2.free;
end;
finally
cds1.free;
end;
end;
你能建议一个更好的方法吗?
解决方法
以下内容如下:
var cds1 : TClientDataSet;
cds2 : TClientDataSet;
cds3 : TClientDataSet;
cds4 : TClientDataSet;
begin
cds1 := Nil;
cds2 := Nil;
cds3 := Nil;
cds4 := Nil;
try
cds1 := TClientDataSet.Create(nil);
cds2 := TClientDataSet.Create(nil);
cds3 := TClientDataSet.Create(nil);
cds4 := TClientDataSet.Create(nil);
///////////////////////////////////////////////////////////////////////
/// DO WHAT NEEDS TO BE DONE
///////////////////////////////////////////////////////////////////////
finally
freeandnil(cds4);
freeandnil(cds3);
freeandnil(cds2);
freeandnil(Cds1);
end;
end;
这使它保持紧凑,并且只尝试释放所创建的实例。真的没有必要执行嵌套,因为任何失败将导致最终丢弃并执行所提供的示例中的所有清理。
就个人而言,我尽量不要在同一个方法中嵌套…除了try / try / except / finally方案之外,如果我发现自己需要嵌套,那么对我来说,这是一个很好的时间,认为重构到另一个方法调用。
编辑清理了一些感谢mghie和utku的评论。
EDIT将对象创建改为不引用应用程序,因为在此示例中它不是必需的。