|
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.
| Code | Meaning |
| 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.
|