try except 与 try finally in Delphi

try except versus try finally in Delphi

在Delphi或fpc中已经提到了很多关于嵌套异常处理的事情。例如 this 之类的东西。我的问题是 如果以下两个版本的代码 之间存在实际差异,我的问题可能解决了对嵌套 try... 块的需求,我没有看到任何 except 如果在 expectfinally...

之后发生未定义的行为或其他事情
try
    StrToInt('AA');
finally
    writeln('I absolutely need this');
end;
writeln('and this');

和...

try
  StrToInt('AA');
except
end;
writeln('I absolutely need this');
writeln('and this');

是的,有区别。巨大的。

如果 try 块中没有异常,那么两个版本都将执行所有代码,但如果存在异常,行为会有所不同。

在您的代码的第一个版本中,finally 块之后的任何内容都不会被执行,异常将传播到下一个级别。

try
    StrToInt('AA'); // if this code throws exception and it will
finally
    writeln('I absolutely need this'); // this line will execute
end;
writeln('and this'); // this line will not execute 

在第二个版本中,异常将由 except 块处理,随后的代码将继续正常执行。

try
  StrToInt('AA'); // if this code throws exception and it will
except
end;
writeln('I absolutely need this'); // this line will execute
writeln('and this'); // this line will also execute

在链接的问题中,您有嵌套的异常块,这种情况的表现与上述情况不同,就像在该问题的答案中解释的那样。


文档:Delphi Exceptions