我想问一下:
try
....TT:=TStringlist.Create;
语句1;
finally
... TT.Free;
end;
其中TT一定会释放吗?如果在语句1中发生异常的话,还要执行fianlly使TT释放吗?
还是应该这样些比较保险呢(如下)
try
try
....TT:=TStringlist.Create;
except
... TT.Free;
end;
finally
... TT.Free;
end;
try
....TT:=TStringlist.Create;
语句1;
finally
... TT.Free;
end;
其中TT一定会释放吗?如果在语句1中发生异常的话,还要执行fianlly使TT释放吗?
还是应该这样些比较保险呢(如下)
try
try
....TT:=TStringlist.Create;
except
... TT.Free;
end;
finally
... TT.Free;
end;
....TT:=TStringlist.Create;
语句1;
finally
... TT.Free;
end;
应该会释放,你可以单步跟踪一下。
try
....TT:=TStringlist.Create; //如果创建时异常则退出,不会触发free
except
Exit;
end;
try
语句1; //不管此句是否异常,运行完毕后都会触发free从而释放资源
finally
... TT.Free;
end;
因此,你不必用第二中写法去写程序代码,第二种写法如果出现异常的时候,将会出错!没有哪个对象再Free之后还能再Free的。
具体情况,你自己调试的时候跟踪一下看看就可以。或者去故意制造个异常,看看执行结果,就明白我说的情况了。
try
....TT:=TStringlist.Create;
语句1;
finally
... TT.Free;
end;
的话在TT:=TStringlist.Create;处创建时出错。那末在finally里free也会出错吧?
try……end 异常处理结构用于对系统资源的保护,它能保证一些必要的代码在异常发生时仍能被执行。它的语法格式如下:
try
受异常保护的代码段;
finally
必须执行的代码段;
end;不管try与finally之间的程序是否发生异常,finally与end之间的代码段都会被执行。
恩,去做个实验。