Announcement

Collapse
No announcement yet.

Verständnisfrage zu "try finally"

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

  • Verständnisfrage zu "try finally"

    Hallo zusammen,

    ich verstehe den Sinn von folgendem Code nicht wirklich:

    Code:
    try
       MachwasGefährliches;
    finally
       RäumSauberAuf;
    end;
    und zwar aus zwei Gründen.


    1.) finally überflüssig
    Der obige Code ließe sich doch komplett ersetzen durch

    Code:
    try
        MachwasGefährliches;
    except
    end;
    RäumSauberAuf;
    und zwar gerade weil der finally-Zweig doch IMMER durchlaufen wird: Wozu brauche ich ihn dann überhaupt?


    2.) Fehlerbehandlung
    Dieser Grund ist IMHO der entscheidende. Wo ist in finally Platz für die Fehlerbehandlung, die eben nicht IMMER, sondern NUR im Fehlerfalle ausgeführt werden soll/darf?
    Verwendet man except, findet sie lässig Platz:

    Code:
    try
        MachwasGefährliches;
    except
         Fehlerbehandlung;      <-- diesen Platz bietet finally gar nicht!
    end;
    RäumSauberAuf;

    Vielleicht stehe ich ja auf dem Schlauch, aber ich habe finally noch nie verwendet, weil mir except dasselbe und mehr bietet.

    Kann mir das jemand erklären bzw. hat ein Gegenbeispiel, wo man mit except nicht weiterkommt, sondern unbedingt finally braucht?
    Gerne würde ich nämlich dazulernen.

    Vielleicht ist es aber auch nur eine Philosophie (nehme ich Delphi oder VB, nehme ich Windows oder Linux ...).
    Wenn das so ist, akzeptiere ich das und sage kein Wort mehr

    Gruß,
    Alex

  • #2
    Verlass man deinen try-Abschnitt mit exit.

    Comment


    • #3
      Exit

      Du meinst so?

      Code:
      try
          MachwasGefährliches;
          exit
      except oder finally
      usw;
      Hm, dann bricht der try-Abschnitt ab und weder except noch finally läuft ab.
      Oder

      Aber wer macht denn auch sowas.

      Comment


      • #4
        Moin Alexander,

        was Bernhard wohl meint: in "finally" wird das abgehandelt, was in jedem Fall, also auch im Fall eines "Exit", "Abort" oder was auch immer noch gemacht werden MUSS.

        Das ist z.B. (für mich das Paradebeispiel) der Fall, wenn Objekte freigegeben werden müssen.
        Beispiel (Blind programmiert, Syntaxfehler sind möglich):

        with TStringlist.Create do
        try
        for i := 1 to 10 do Add(IntToStr(i));
        ShowMessage(CommaText);
        finally
        Free;
        end;

        Gruß,

        Geert

        Comment


        • #5
          Originally posted by Geert Dade View Post
          was Bernhard wohl meint: in "finally" wird das abgehandelt, was in jedem Fall, also auch im Fall eines "Exit", "Abort" oder was auch immer noch gemacht werden MUSS.
          Genau. Hätte wohl doch etwas mehr schreiben sollen. Hatte gehoft dieser kleine Hinweis reicht.

          Comment


          • #6
            Also was ich schon viel gesehen habe ist, dass z.B. offene Db-Objekte im Finally geschlossen wurden.
            http://www.entwicklerblog.com

            There are 10 kind of people in this world, those who know binary, and those who don't.

            Comment


            • #7
              Aha,

              d.h. der Except-Fall wird im Falle eines Abbruches nicht durchlaufen?

              Ich war immer davon ausgegangen, dass ein Abbruch in einer Try-Umgebung eine Exception auslöst und daher der Except-Zweig angesprungen wird.
              Dann habe ich ja schonmal was gelernt. DANKE!

              Aber was ist mit meinem zweiten Grund?
              Wo findet in Try-Finally die explizite Fehlerbehandlung statt, also NUR wenn der Fehler auftritt?

              Wenn ich euch richtig verstanden habe, ist ja beides nich so dolle, und es müsste eine Syntax nach folgender Art geben:

              Code:
              try
                 Gefährliches;
              except
                 Fehlerbehandlung;
              finally
                 MachSauber;
              end;
              um GANZ sicher zu gehen. Aber die gibts ja gerade nicht.

              Comment


              • #8
                Moin Alexander,

                es sind einfach zwei verschiedene Behandlungsfälle:
                Einmal "auf jeden Fall machen" und einmal "Fehlerbehandlung".

                Das von Dir gewünschte Konstrukt gibt es fast so wie von Dir geschrieben:

                try
                try
                Gefährliches;
                except
                Fehlerbehandlung;
                end;
                finally
                MachSauber;
                end;

                Gruß,

                Geert

                Comment

                Working...
                X