FILE STATUS

7.6 FILE STATUS (error handling)

A number of errors can occur that result from file input/output that programmer may wish to be able to deal with in order to avoid unexpected program termination.

Run time errors can arise quite easily from a file not being available to open, or if present the data is corrupted. Furthermore, what if there is no more disk space available or not enough space has been allocated to allow for addtition of new data. Other errors, such as attempting to close a file that isn't open, or to read a file opened for output only, may well derive from logical errors (that is, programming mistakes) but can be dealt with nonetheless when debugging. These kinds of errors will normally result in termination of the program run, whereas using File Status can allow the programmer to deal with any such problems without the program run stopping and returning to the operating system.

File Status Codes are made of two digits, the first indicates one one of 5 classes:

0 Input/output operation successful
1 File "at end" condition
2 Invalid key
3 Permanent I/O error
4 Logic error

The second digit refers to the particular case within the class. Here are examples common to both Microfocus and Fujitsu compilers (although there are more besides). I would check your compiler documentation.

CodeMeaning
00 Input/output operation successful
02 Duplicate record key found (READ ok)
04 Length of record too large (READ ok)
10 File AT END
14 "The valid digits of a read relative record
number are greater than the size of the relative
key item of the file." from Fujitsu manual -
I'm not sure I what that means!
16 Program tries to read file already AT END
note: Fujitsu compiler returns code "46" in this case
22 Program attempts to write a record
with a key that already exists
23 Record not found
24 Program attempts to write record to a disk that is full
30 Input/output operation unsuccessful,
no further information available
34 Program attempts to write record to a disk that is full
35 Program tries to open non-existant file
for INPUT, I-O or EXTEND
37 Program tries to open line sequential file in I-O mode
41 Program tries to open file that is already open
42 Program tries to close file that is not open
43 Program tries to delete or rewrite a record
that has not been read
44 Program tries to write or rewrite a record of incorrect length
46 Program tries to read a record where the previous read or
START has failed or the AT END condition has occurred
47 Program tries to read a record from a file opened
in the incorrect mode
48 Program tries to write a record from a file opened
in the incorrect mode
49 Program tries to delete or rewrite a record from a file opened
in the incorrect mode

To use these codes you need to include the FILE STATUS clause in the SELECT statement of the environment division:

     SELECT TEST-FILE ASSIGN TO 'TEST-DATA.DAT'
       ORGANIZATION IS SEQUENTIAL
       FILE STATUS IS W-STATUS.

Of course W-STATUS could any user name you like. It must however be defined in working storage as PIC XX, i.e. as alpha numeric and not numeric. So, if during a program run a certain input/output error occurs, rather than the program terminate, the program will simply produce an error status.
You might code:
* Here a possible danger of too big a record being moved into W-RECORD
     READ RECORD-IN INTO W-RECORD
       IF W-STATUS = "04" THEN
          DISPLAY "Over-sized record has been read"
          SET REC-XS-FLAG TO TRUE
       END-IF
     

Another example might be, when reading from an indexed file:

     READ IN-FILE
       IF W-STATUS = "23" THEN
          DISPLAY "Record not found"
       ELSE PERFORM MAIN-PROCESS
     

You could have easily have written:

     READ IN-FILE
       INVALID KEY
          DISPLAY "Record not found"
       NOT INVALID KEY PERFORM MAIN-PROCESS
     END-READ

So consider which is the best option and remember not to try and do both.

For Fujitsu compilers at least, although the program run is not terminated, the Fujitsu WINEXE enviroment will still produce a prompt indicating the error (with more detailed error codes). I'm not sure, but I suspect that this facility can be disabled. Check the user manual.