Programmiersprache Pascal

Abschlußhandlungen nach einer Ausnahme

Standard Pascal, Extended Pascal

Programmausnahmen können nur automatisch vom jeweiligen Pascal-Laufzeitsystem behandelt werden.


Delphi

Der Anweisungsblock, für den Abschlußhandlungen garantiert werden sollen, wird wie folgt notiert:

  TRY
    anweisungsfolge_1             {  Normalteil  }
    FINALLY
      anweisungsfolge_2           { Abschlußteil }
  END;
anweisungfolge_1 umfaßt die im Normalfall auszuführenden Anweisungen. Tritt bei der Abarbeitung einer Anweisung des Normalteils eine Ausnahme ein, so werden alle nachfolgenden Anweisungen des dieses Teils übergangen. Es ist jedoch garantiert, daß anweisungfolge_2 ausgeführt wird.

In vielen Situationen ist es weniger wichtig1 festzustellen, welche Ausnahme aufgetreten ist, da eine gezielte Behandlung der Ausnahme nicht möglich ist. Statt dessen ist es aber wichtig, bestimmte Abschlußhandlungen auszuführen, bevor das Programm in einen neuen Programmabschnitt eintritt oder abbricht.
Solche Handlungen können z.B. sein:

1Bemerkung:
Für den Programmierer sollte es natürlich schon wichtig sein festzustellen, welche Ausnahmen auftreten ...
Hier geht es um automatische Handlungen zur Laufzeit des Programms.

Beispiel:

  VAR f : TEXT;

  AssignFile(f, 'dateiname');
  Rewrite(f);
  TRY
    create_file(f);
    FINALLY                 { Datei f wird geschlossen, auch nach dem }
      CloseFile(f);         { Auftreten von Ausnahmen in create_file  }
  END;
Die Ausführung von CloseFile kann sehr wichtig sein, da alle bis zum Auftreten eines Fehlers erfolgten Ausgaben in die zu erstellende Datei sonst verloren gehen können:
Die Ausgabedaten gelangen zunächst in einen Ausgabepuffer. Die Übertragung der Daten in die Datei erfolgt erst mit dem Schließen der Datei oder einem Aufruf der Prozedur flush.

Geht es darum, sowohl Fehler des Laufzeitsystems abzufangen als auch Abschlußhandlungen auszuführen, so müssen ein TRY-EXCEPT-Block und ein TRY-FINALLY-Block miteinander gekoppelt werden.
Dies geschieht durch Schachtelung: Der TRY-FINALLY-Block schließt einen TRY-EXCEPT-Block ein.

Beispiel:

  PROGRAM except;
  USES SysUtils;

  VAR f : TEXT;
      x, y, z : REAL;
  BEGIN
    AssignFile(f, 'test.dat');
    Rewrite(f);
    TRY
      x := ...;  y := ...;
      Writeln(f, 'x = ', x, ' y = ', y);
      TRY
        z := x/y;
        Writeln(f, 'z = ', z);
        EXCEPT
          ON Exception DO
            Writeln(f, 'z konnte nicht berechnet werden');
      END;
      FINALLY
        CloseFile(f);
    END;
  END.

Pascal++

Spezielle Sprachmittel zur Ausführung von Abschlußhandlungen sind nicht vorgesehen.



P. Böhme, 29.08.1996