如何在没有EAbort的情况下中止?

时间:2016-08-24 11:10:50

标签: delphi exception

有没有办法在不引发EAbort异常的情况下中止方法的执行?

这是一个问题:

....

try
  i := strtoint(Edit1.Text);
  if not (i=10) then
  begin
    showmessage('Value for I must be 10 !');
    sysutils.abort;
  end;
except
  showmessage('Wrong Value for i !');
end;

showmessage('Execution continue ...');

...

在这个示例中,如果i的值为5,程序执行将不会中止...它将显示消息“我必须为10的值!”,然后消息“i的值不正确!” (因为引发了EAbort异常)然后消息“Execution continue ...”。我知道如何解决这种情况,但我需要没有EAbort异常的sysutils.abort的通用解决方案。

1 个答案:

答案 0 :(得分:10)

退出当前方法
如果退出程序,请使用普通exit 如果退出函数(*),则为exit(return_code)

请注意,exit块中不会捕获try-except,但会在try-finally块中捕获它。 如果您想要更细粒度的控制,可以使用breakcontinue来打破循环 最后有goto的选项。这是最后的选择,通常被认为是代码气味。

样品:

function ExitBreakContinue(WhatToDo: integer): string;
var
  a,b,i: integer;
label SomeLabel;
begin
  a:= 0; b:= 0;
  try
    for i:= 0 to 10 do begin
      a:= a + 1;
      case WhatToDo of
        1: exit('exit_called');
        2: continue;
        3: break;
        4: abort;
        5: goto SomeLabel;
      end;
      b:= b + 1;
    end; {for i}
    Result:= 'a,b = '+IntToStr(a)+','+IntToStr(b);
  finally
    Result:= Result + ' finally';
  end;
  SomeLabel: Result:= Result + ' goto '; 
end;

关闭您的申请
在图形应用程序中,您可以调用application.terminate 在控制台应用程序中,使用退出代码调用halt,或使用错误代码调用RunError

halt / RunError也可以在图形应用程序中使用,但不推荐使用,因为它不允许应用程序正常关闭。
这会让您的用户感到不安,因为无法触发主窗体的OnCloseQuery事件 通常,您(提供)将保存用户在此事件处理程序中的工作。

(*) exit(return_code) is supported in Delphi 2009 and newer.