【问题标题】:How to abort without EAbort? [closed]如何在没有 EAbort 的情况下中止? [关闭]
【发布时间】:2016-08-24 11:10:49
【问题描述】:

有没有办法在不引发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,程序执行将不会中止......它将显示消息“I 的值必须为 10!”,然后显示消息“i 的值错误!” (因为引发了 EAbort 异常),然后消息“Execution continue ...”。我知道如何解决这种情况,但我需要没有 EAbort 异常的 sysutils.abort 通用解决方案。

【问题讨论】:

  • System.Halt; “Halt 执行程序异常终止并返回操作系统。”
  • 你说:“有没有办法中止delphi程序的执行……”。
  • Exit 将结束一个过程。
  • @OnLineNG,请停止在 cmets 中扩展问题。你应该: 1:想想你的问题。 2:做一些研究。 3:制定一个完整的查询,其中包含回答它所需的所有详细信息。这不是在线聊天会话。而且您从未在问题中提及有关数据集、字段或事件的任何内容。
  • 您想在不引发异常且不使用exit 的情况下离开过程吗?那是对的吗?你准备好迎接失望的可能性了吗?你能提供这个问题的动机吗?

标签: delphi exception


【解决方案1】:

只是退出当前方法
如果退出过程,请使用纯 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.

【讨论】:

  • No ... Halt 和/或 Application.Terminate 将终止程序并关闭它...但我不会这样做...我只需要中止该过程,就像sysutils.Abort 做...(如果它不在 try/except 块中)...
  • 如果我用 ExitBreakContinue(4) 替换“sysutils.abort”,我将得到与我的示例相同的行为...
  • Exit 在某些情况下会做我需要的。但是,如果我需要将此代码放入例如。 TField 的 OnValidate 事件并将“sysutils.abort”替换为“Exit”,然后我将收到“Wrong value”消息,但将发布数据集更改(不像 sysutils.abort 那样中止)。
  • @OnLineNG 显然你很困惑。您不了解您的具体问题,但遗憾的是您没有就您的具体问题提出问题。你问了一个关于其他事情的明确问题,这是你的答案。你问错问题是你的问题。你需要停止寻找灵丹妙药,多花点时间弄清楚你的问题到底是什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-21
  • 1970-01-01
  • 2021-03-26
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多