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.
A D V E R T I S E M E N T
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.
|