Announcement

Collapse
No announcement yet.

On Error GoTo

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • On Error GoTo

    Kennt jemand einen Tick unter Delphi die BASIC Fehlerbehandlung mit
    "OnError Goto / Resume / Resume Next" nachzubilden? On Error Goto geht mit
    "try except" ja schon ganz gut. Aber Resume (wiederaufsetzen an der Unterbrechungsstelle)
    und Resume Next (Wiederaufsetzen hinter der Unterbrechungsstelle) sind doch sehr nützliche
    Dinge.
    Peter

  • #2
    Hi Peter,

    Versuch mal mit:
    Try
    <Anweisung>
    Except
    <Fehlerbehandlung>
    End;
    Try
    <Nächte Anweisung>
    Execpt
    <Fehlerbehandlung
    End;
    Mir ist kein Weg bekannt, direkt hinter der letzten Anweisung direkt
    fortzufahren. Aber mit mehreren Try / Except wird dasselbe Ziel erreicht.
    Aber vielleicht hat jemand einen eleganteren Weg??

    Carste

    Comment


    • #3
      Hi Carsten,
      damit wären wir dann genau wieder bei der "klassischen Form" der Fehlerabfragen an allen Stellen an denen Fehler auftreten könnten. Ich bin bestimmt kein BASIC Fan (ganz im Gegenteil) aber die Fehlerbehandlung ist doch sehr praxisgerecht.
      Pete

      Comment


      • #4
        Hallo,

        irgend einen Vorteil müssen <b>Interpreter</b> wie Visual Basic (nicht immer wo EXE draufsteht, ist auch wirklich EXE drin) schon haben. Doch Scherz beseite, das <b>On Error GoTo</b> von Visual Basic steht auch unter Delphi zur Verfügung, wie das folgende Beispiel demonstriert:

        <pre>
        unit Unit1;

        interface

        uses
        Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
        StdCtrls;

        const
        PM_ERROR_RETRY = WM_APP + 1;

        type
        TForm1 = class(TForm)
        Button1: TButton;
        Edit1: TEdit;
        procedure Button1Click(Sender: TObject);
        private
        { Private-Deklarationen }
        FFirstCall : Boolean;
        public
        { Public-Deklarationen }
        procedure PMERROR_RETRY(var Msg: TMessage); message PM_ERROR_RETRY;
        procedure DoWork;
        end;

        var
        Form1: TForm1;

        implementation

        {$R *.DFM}

        procedure TForm1.Button1Click(Sender: TObject);
        begin
        FFirstCall := True;
        DoWork
        end;

        procedure TForm1.DoWork;
        begin
        try
        if FFirstCall then
        begin
        FFirstCall := False;
        ShowMessage(IntToStr(StrToInt(Edit1.Text)));
        end
        else
        ShowMessage('Der 2. Versuch hat geklappt');
        except
        PostMessage(Handle, PM_ERROR_RETRY, 0, 0);
        end;
        end;

        procedure TForm1.PMERROR_RETRY(var Msg: TMessage);
        begin
        DoWork
        end;

        end.
        </pre&gt

        Comment


        • #5
          Vielen Dank,<br>
          der Trick mit der Rekursion via PostMessage ist sicher sehr hilfreich. Das Wiederaufsetzen am bzw hinter dem Fehlerabruch leistet er aber nicht. Das Wiederaufsetzen wird ja von IF/Then/Else mittels des FirstCall Flag gesteuert. Bei mehreren potentiellen Fehlerstellen müssten diese wieder einzeln betrachtet werden, womit wir wieder bei der klassischen Form des Fehlerabfangens währen ..

          Comment

          Working...
          X