Fehlerbehandlung

Wenn in Programmen mit Dateien gearbeitet wird, kommt es dabei immer wieder zu Fehlern. Beispielsweise soll eine Datei von Diskette eingelesen werden und die falsche Diskette steckt im Laufwerk. Es kann aber auch zu internen Fehlern kommen. So wird beispielsweise versucht, einen Satz aus der Datei zu lesen, obwohl das Dateiende bereits erreicht wurde oder ähnliches.
Damit es in solchen Situationen nicht laufend zu Programmabbrüchen kommt, gibt es die Möglichkeit, sich vorher zu überlegen, was schief gehen könnte und mit Hilfe von Unterprogrammen diese Fehler im Falle ihres Auftretens im Programm zu behandeln.
Hierbei handelt es sich nicht um normale Unterprogramme. Diese Fehlerbehandlungsroutinen werden in einem eigenen, speziell für diesen Zweck reservierten Teil des Programmcodings, untergebracht. Es handelt sich dabei um den:

DECLARATIVES-Teil
Dieser Programmteil muß in der Reihenfolge des Codings unmittelbar hinter PROCEDURE DIVISION stehen und wird mit dem Schüsselwort DECLARATIVES eingeleitet. Beendet wird er durch END DECLARATIVES. Beide Schlüsselwörter müssen im A-Bereich stehen und mit einem Punkt abgeschlossen werden.
Der DECLARATIVES-Teil kann eine oder mehrere SECTION's enthalten. Die Anweisungen in den SECTION's unterliegen dabei lediglich den allgemeinen Regeln, so daß nichts besonderes zu beachten ist. Jedoch wird man zur näheren Fehleranalyse das FILE STATUS-Feld verwenden, um aus dessen Inhalt den konkreten Fehler auszulesen.
Der DECLARATIVES-Teil wird zur Laufzeit nicht automatisch ausgeführt, sondern nur für den Fall, daß ein Fehler auftritt. Aus ihm darf nicht in andere Programmteile verwiesen werden. Auch darf aus anderen Programmteilen nicht in den DECLARATIVES-Teil verwiesen werden.
Um dem Programm 'mitzuteilen', worauf es zu reagieren hat, verwendet man die

USE-Anweisung
Diese bildet sozusagen die Brücke zwischen den Programmteilen im DECLARATIVES-Teil und den entsprechenden Dateien. Die USE-Anweisung folgt direkt auf den Namen der entsprechenden SECTION und beschreibt den Fall eines Fehlers, bei dem diese SECTION ausgeführt werden soll.
Hierbei kann entweder explizit die Datei mit Namen angegeben werden (z.B. wenn ein Lesefehler in der Datei 'Stamm.dat' auftritt, dann soll das und das geschehen) oder die 'Art des Fehlers' (z.B. wenn ein Lesefehler bei einer mit INPUT geöffneten Datei auftritt, dann soll das und das geschehen). Als 'Fehlerarten' kommen dabei:

INPUT
OUTPUT
I-O
EXTEND

in Frage.
Wird die Angabe des Dateinamens gewählt, so darf es für diese Datei im DECLARATIVES-Teil nur eine SECTION geben. Tritt dann ein Fehler in der entsprechenden Datei auf, so werden nur die Anweisungen in dieser SECTION berücksichtigt - auch wenn noch Fehlerdefinitionen in anderen SECTIONS des DECLARATIVES-Teil zutreffen.
Man kann entweder das Wort ERROR oder EXCEPTION verwenden.

Beispiel:
          :
          :
ENVIRONMENT DIVISION.
          :
INPUT-OUTPUT SECTION.
FILE-CONTROL.
   SELECT Stamm ASSIGN TO "C:Stamm.dat"
          ORGANIZATION IS LINE SEQUENTIAL
          FILE STATUS IS Stamm-Stat.
          :
FILE SECTION.
FD Stamm.

01 Stamm-Satz PIC X(350).
          :
WORKING-STORAGE SECTION.
01 Stamm-Stat.
   05 Status-Stelle-1 PIC 9.
   05 Status-Stelle-2 PIC 9.
01 Fehler REDEFINES Stamm-Stat PIC 9(4) COMP.

01 Ausgabe-Stamm-Status.
   05 Aus-Stamm-Stat-1 PIC 9.
   05 Aus-Stamm-Stat-2 PIC /999.

01 Fehltext-1 PIC X(20) VALUE "Kein Platz mehr da!".

01 Fehltext-2 PIC X(20) VALUE "Dateiname unkorrekt.".

01 Fehltext-3 PIC X(20) VALUE "Datei gibt's nicht!".

01 Fehlausgabe PIC X(20).

PROCEDURE DIVISION.
DECLARATIVES.
Stammdatenfehler SECTION. USE AFTER STANDARD ERROR PROCEDURE ON Stamm.
   IF Status-Stelle-1 = 9
      MOVE Status-Stelle-1 TO Aus-Stamm-Stat-1
      MOVE LOW-VALUE TO Status-Stelle-1
      MOVE Fehler TO Aus-Stamm-Stat-2
      IF Fehler = 007 MOVE Fehltext-1 TO Fehlausgabe
         ELSE IF Fehler = 004 MOVE Fehltext-2 TO Fehlausgabe
            ELSE IF Fehler = 013 MOVE Fehltext-3 TO Fehlausgabe
               ELSE MOVE "Programmierfehler !!" TO Fehlausgabe.
   DISPLAY "Fehler-Nr:" AT 0301.
   DISPLAY Ausgabe-Satmm-Satus AT 0312.
   DISPLAY Fehlausgabe AT 0317.
Stammdatenfehler-Ende.
   EXIT.
Ausgabefehler SECTION. USE AFTER STANDARD EXCEPTION PROCEDURE ON OUTPUT.
          :
          :
Ausgabefehler-Ende.
   EXIT.
END DECLARATIVES.

Programm SECTION.
          :
          :

Nehmen wir nun an, daß auf der Platte C: keine Datei mit dem Namen 'Stamm.dat' zu finden wäre, so würde folgende Meldung auf dem Bildschirm erscheinen:

Fehler-Nr: 9/013 Datei gibt's nicht!


...

" Hallo Computer "