使用try-except块包装try-finally块之间有什么区别,反之亦然?

时间:2012-09-16 08:55:27

标签: delphi exception-handling

Delphi中两种编码模式之间是否存在实际差异:

版本1

try
  try
    {Do something}
  finally
    {Do tidy up}
  end
except
  {Handle exception}
end;

版本2

try
  try
    {Do something}
  except
    {Handle exception}
  end
finally
  {Do tidy up}
end;

2 个答案:

答案 0 :(得分:6)

有两点不同:

  1. except和finally块执行的相对顺序不同。在版本1中,finally在except之前执行。在版本2中,执行顺序是相反的。
  2. 在版本1中,如果finally块引发,则它将由except块处理。在版本2中,如果finally块引发,则它将由下一个包含异常处理程序处理,即在此代码之外。
  3. 通常你不关心最后提升的块。你根本不希望这种情况发生,如果确实发生了,可能会发生一些事情。

    因此,重要的区别在于finally是否在异常处理程序之前运行,反之亦然。有时它并不重要,但它通常会产生影响。

答案 1 :(得分:2)

当您在执行的行下面使用try..except时。

Resource := TAbstractResource.Create;
try
  Resource.DoSomeThing;
except
  On E:Exception Do 
   HandleException(E);
end;
FreeAndNil(Resource);