2016-08-24 2 views
-5

Gibt es eine Möglichkeit, die Ausführung einer Methode abzubrechen, ohne eine EAbort Ausnahme auszulösen? HierWie kann ich ohne EAbort abbrechen?

ist ein Problem:

.... 

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 ...'); 

... 

In diesem Beispiel Programmausführung wird nicht abgebrochen werden, wenn der Wert für i 5 ... es wird die Meldung angezeigt, dann Meldung „Wert für I 10 sein muss!“ "Falscher Wert für i!" (weil die EAbort-Ausnahme ausgelöst wird) und dann die Nachricht "Ausführung fortsetzen ...". Ich weiß, wie ich diese Situation lösen kann, aber ich brauche eine allgemeine Lösung für sysutils.abort ohne EAbort-Ausnahme.

+0

System.Halt; "Halt führt eine abnormale Beendigung eines Programms durch und kehrt zum Betriebssystem zurück." –

+0

Nein ... Halt und/oder Application.Terminate beendet das Programm und schließt es ... aber ich mache das nicht ... Ich muss dieses Verfahren nur abbrechen, genau wie sysutils.Abort ... (Wenn es nicht in try/except Block ist) ... – OnLineNG

+7

Du hast gesagt: "Gibt es eine Möglichkeit, die Delphi-Programmausführung abzubrechen ... *". –

Antwort

9

Gerade Verlassen der aktuellen Methode
Verwenden Klar exit Wenn eine Prozedur beenden.
Oder exit(return_code) beim Verlassen einer Funktion (*).

Beachten Sie, dass nicht in einem try-except Block gefangen wird, aber es wird in einem try-finally Block gefangen.
Wenn Sie eine feinere Kontrolle wünschen, können Sie Schleifen mit break und continue brechen.
Schließlich gibt es die Option goto. Dies ist die Option des letzten Ausweges und wird allgemein als Code-Geruch betrachtet.

Probe:

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; 

Schließen der Anwendung
In einer grafischen Anwendung, die Sie application.terminate nennen würde.
In einer Konsolenanwendung rufen Sie halt mit einem Exit-Code oder RunError mit einem Fehlercode auf.

halt/RunError funktioniert auch in einer grafischen Anwendung, wird aber nicht empfohlen, da die Anwendung nicht ordnungsgemäß beendet werden kann.
Dies wird Ihre Benutzer verärgern, weil das Ereignis OnCloseQuery des Mainform nicht ausgelöst werden kann.
Normalerweise würden Sie die Arbeit des Benutzers in diesem Event-Handler speichern (anbieten).

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

+0

Nein ... Halt und/oder Application.Terminate beendet das Programm und schließt es ... aber ich mache das nicht ... Ich muss nur diesen Vorgang abbrechen, genau wie sysutils.Abort ... (Wenn es nicht in try/except Block ist) ... – OnLineNG

+0

Wenn ich "sysutils.abort" durch ExitBreakContinue (4) ersetze, werde ich dasselbe Verhalten wie in meinem Beispiel bekommen ... – OnLineNG

+0

Exit wird tun, was ich in einigen Fällen brauche . Aber, wenn ich diesen Code z. OnValidate-Ereignis von TField und ersetzen "sysutils.abort" mit "Exit", dann werde ich "Falscher Wert" Nachricht erhalten, aber Datensatzänderungen werden gebucht (nicht abgebrochen wie bei sysutils.abort). – OnLineNG

Verwandte Themen