您可以使用例外。
在内部 if 或循环中调用 Abort,并在您想要继续的地方捕获 EAbort 异常
procedure ...
begin
try
if .... then
begin
(* here the code to execute *)
if I_want-to-exit then Abort;
(* here the code not to execute if has exited *)
end;
except on E: EABORT do ;
end;
(* here the code to execute *)
end;
UPD。有人刚刚对此表示赞同。似乎这个话题很久以前就被埋没了。好的,然后快速总结一下这里和那里的评论中隐藏的内容。
这种方法可能不如 Marjan 的 try-exit-finally 一种,见他的回答:https ://stackoverflow.com/a/11689392/976391
Delphi 中的例外情况稍微便宜一些,Borland 在这方面持有的专利很少,但仍然finally
可能比raise
+执行得更快except
。
OTOH,由于可以使用异常取消和不同的分类,这种方法可以概括为具有多个嵌套的可退出 if 块和不同的退出目标。而且我觉得代码更简洁,更好地表达了开发人员(主题启动者)的思路,当 except-block 只是一个退出锚点时,真正的代码在它之后,而不是在它里面(最终解决方案所需要的) )。
type EExitException1 = class(Exception) end;
type EExitException2 = class(Exception) end;
procedure ...
begin
try
if .... then
begin
(* here the code to execute *)
try
if .... then
begin
(* here the nested code to execute *)
if I_want-to-exit then raise EExitException1.Create();
(** ... **)
if I_want-to-exit-far-away then raise EExitException2.Create();
(* here the code not to execute if if-block cancelled *)
end; // if
(* here the code to execute *)
if I_want-to-exit-outer-if-here then raise EExitException2.Create();
(* here the code not to execute *)
except on E: EExitException1 do ; end; // killing the exception
(* here the code to execute after the outer if-block exit *)
end;
(* one more piece of skippable code *)
except on E: EExitException2 do ; end;
(* here the code to execute yet again *)
end;
然而,这种概括也往往很快变成意大利面条,只是另一种。
诚然,这个问题看起来很糟糕,需要对整个部分进行重构。如果不进行重构,所有解决方案都会以某种方式变得混乱。如果梯子,普通旧goto
,标志变量 - 选择你的毒药。我们可以争论到底哪一个不那么丑,但他们都丑。