Topik ini membahas dua mekanisme penanganan error berkas pada COBOL, yaitu klausa FILE STATUS dan prosedur DECLARATIVES. Setelah membacanya, arti setiap digit pada nilai status operasi berkas dapat ditafsirkan dengan tepat, dan reaksi terhadap kegagalan berkas dapat dipusatkan pada satu bagian program alih-alih tersebar di banyak percabangan. Kedua mekanisme diperkenalkan melalui program yang benar-benar dikompilasi dan dijalankan, sehingga setiap keluaran yang ditampilkan merupakan keluaran asli.
Anatomi nilai status dua digit#
Klausa FILE STATUS ditempatkan pada pernyataan SELECT dan menunjuk satu variabel kerja yang menampung hasil setiap operasi berkas. Variabel tersebut dideklarasikan pada WORKING-STORAGE dengan PIC XX, kemudian diisi secara otomatis oleh runtime setelah OPEN, READ, WRITE, REWRITE, atau CLOSE dijalankan. Tanpa klausa ini, kegagalan operasi berkas biasanya menghentikan program lewat pesan runtime, sehingga program tidak memperoleh kesempatan bereaksi. Dengan klausa ini, keputusan penanganan error sepenuhnya berada pada logika program.
Nilai status terdiri atas dua digit yang masing-masing membawa makna. Digit pertama menyatakan kelas hasil operasi, sedangkan digit kedua merinci penyebab error di dalam kelas tersebut.
| Digit pertama | Kelas hasil |
|---|---|
| 0 | Operasi berhasil |
| 1 | Kondisi at end, yaitu READ telah mencapai akhir berkas |
| 2 | Kondisi kunci pada berkas terindeks atau relatif |
| 3 | Error permanen, misalnya berkas tidak ada saat dibuka |
| 4 | Error logika, misalnya berkas dibaca padahal tidak terbuka |
| 9 | Ditentukan implementasi, biasanya kegagalan tingkat sistem |
Kombinasi dua digit yang paling sering ditemui pada kerja berkas dirangkum pada tabel berikut.
| Nilai | Arti |
|---|---|
| 00 | Operasi berhasil |
| 10 | Akhir berkas tercapai |
| 23 | Rekaman yang diminta tidak ditemukan pada pembacaan acak |
| 35 | Berkas tidak ada saat OPEN untuk INPUT atau I-O |
| 41 | Berkas sudah terbuka saat OPEN dijalankan |
| 42 | Berkas sudah tertutup saat CLOSE dijalankan |
| 44 | Panjang rekaman tidak sesuai dengan deskripsi FD |
Cara membacanya mengikuti pola yang sistematis. Status 35 terdiri atas digit 3 yang menyatakan error permanen dan digit 5 yang merinci berkas tidak ditemukan. Status 10 bukan kegagalan, melainkan tanda bahwa seluruh rekaman sudah dibaca, sehingga perlakuannya berbeda dari status 35. Karena itu, pencabangan program umumnya menguji digit pertama terlebih dahulu untuk menentukan kelasnya, kemudian merinci digit kedua bila diperlukan.
Status pada OPEN yang gagal#
Program berikut membuka berkas bernama nilai.dat yang sengaja tidak disediakan pada direktori kerja. Hasil operasi ditampung WS-STATUS, lalu nilainya ditampilkan dan diuji.
IDENTIFICATION DIVISION.
PROGRAM-ID. STATUS-BERKAS.
*> Menampilkan nilai FILE STATUS ketika berkas tidak ditemukan.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT DATA-NILAI ASSIGN TO "nilai.dat"
ORGANIZATION IS LINE SEQUENTIAL
FILE STATUS IS WS-STATUS.
DATA DIVISION.
FILE SECTION.
FD DATA-NILAI.
01 REK-NILAI PIC X(20).
WORKING-STORAGE SECTION.
01 WS-STATUS PIC XX.
PROCEDURE DIVISION.
UTAMA.
OPEN INPUT DATA-NILAI
DISPLAY "Status pembukaan berkas : " WS-STATUS
IF WS-STATUS NOT = "00"
DISPLAY "Berkas gagal dibuka, program dihentikan"
END-IF
STOP RUN.Status pembukaan berkas : 35
Berkas gagal dibuka, program dihentikanKompilasi program dengan perintah berikut.
# kompilasi program status berkas
cobc -x status.cblJalankan ./status pada direktori yang tidak memuat berkas nilai.dat. Kedua baris keluaran berasal dari program, bukan dari runtime. Nilai 35 mengonfirmasi tabel di atas, yaitu error permanen dengan rincian berkas tidak ditemukan, sedangkan baris kedua membuktikan percabangan IF berjalan karena statusnya memang bukan 00. Program berhenti melalui STOP RUN tanpa pernah membaca isi berkas, karena tidak ada berkas yang dapat dibaca.
Reaksi terpusat dengan DECLARATIVES#
Menyalin pengujian status setelah setiap verb berkas menimbulkan pengulangan yang rawan terlewat. COBOL menyediakan prosedur deklaratif (declarative), yaitu bagian program yang dijalankan runtime setiap kali operasi pada berkas tertentu menghasilkan error. Dengan cara ini, reaksi penanganan error ditulis satu kali dan seluruh verb pada berkas tersebut otomatis dilindungi.
Penulisan bagian ini mengikuti pola yang tetap. Bagian DECLARATIVES ditulis tepat setelah PROCEDURE DIVISION dan sebelum badan program. Setiap berkas yang dilindungi mendapat satu SECTION yang kalimat pertamanya adalah pernyataan USE AFTER STANDARD ERROR PROCEDURE ON nama-berkas, dan keseluruhan bagian ditutup dengan END DECLARATIVES.
Program berikut menerapkan kerangka tersebut pada berkas yang sama. Ketika OPEN menghasilkan status selain 00, runtime menjalankan SECTION ERROR-NILAI terlebih dahulu, lalu STOP RUN di dalamnya mengakhiri program secara terkendali. Akibatnya, pernyataan sesudah OPEN tidak pernah dijalankan.
IDENTIFICATION DIVISION.
PROGRAM-ID. DEKLARATIF.
*> Prosedur deklaratif menangani error pembukaan berkas.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT DATA-NILAI ASSIGN TO "nilai.dat"
ORGANIZATION IS LINE SEQUENTIAL
FILE STATUS IS WS-STATUS.
DATA DIVISION.
FILE SECTION.
FD DATA-NILAI.
01 REK-NILAI PIC X(20).
WORKING-STORAGE SECTION.
01 WS-STATUS PIC XX.
PROCEDURE DIVISION.
DECLARATIVES.
ERROR-NILAI SECTION.
USE AFTER STANDARD ERROR PROCEDURE ON DATA-NILAI.
TANGANI-ERROR.
DISPLAY "Prosedur deklaratif aktif"
DISPLAY "Status berkas : " WS-STATUS
STOP RUN.
END DECLARATIVES.
UTAMA.
OPEN INPUT DATA-NILAI
DISPLAY "Baris ini tercetak hanya bila berkas berhasil"
STOP RUN.Prosedur deklaratif aktif
Status berkas : 35Kompilasi program dengan perintah berikut, kemudian jalankan ./deklaratif.
# kompilasi program deklaratif
cobc -x deklaratif.cblPesan pertama dan nilai status berasal dari prosedur deklaratif, sedangkan baris “Baris ini tercetak hanya bila berkas berhasil” tidak pernah muncul karena program sudah berhenti sebelum pernyataan itu sempat dijalankan. Apabila prosedur deklaratif tidak mengakhiri program, eksekusi berlanjut pada pernyataan sesudah pernyataan yang memicu error, sehingga STOP RUN dipilih agar pekerjaan tidak dilanjutkan tanpa berkas. Kondisi at end tidak memicu prosedur ini karena status 10 bukan error, melainkan hasil normal dari READ.
Kesalahan umum#
- Lupa menambahkan klausa FILE STATUS pada SELECT. Kegagalan OPEN kemudian menghentikan program lewat pesan runtime tanpa memberi program kesempatan bereaksi. Tambahkan klausa beserta variabel PIC XX untuk menampung nilainya, lalu periksa status setelah setiap operasi penting.
- Melanjutkan proses tanpa memeriksa status. READ pada berkas yang gagal terbuka memicu error logika baru, dan laporan yang dihasilkan tampak sah padahal kosong. Pastikan status 00 diperoleh sebelum pekerjaan berlanjut.
- Menulis pernyataan USE di luar bagian DECLARATIVES atau melupakan kata SECTION. Compiler menolak program semacam itu. Pernyataan USE wajib menjadi kalimat pertama sebuah SECTION di dalam bagian DECLARATIVES.
Ringkasan#
- Klausa FILE STATUS IS pada SELECT menampung hasil dua digit setiap operasi berkas, dengan digit pertama sebagai kelas dan digit kedua sebagai rincian.
- Status 35 menyatakan berkas tidak ada pada waktu OPEN, sedangkan status 10 adalah kondisi at end dan bukan error.
- Bagian DECLARATIVES dengan USE AFTER STANDARD ERROR PROCEDURE ON memusatkan reaksi error suatu berkas pada satu SECTION.
- Setelah prosedur deklaratif selesai tanpa mengakhiri program, eksekusi berlanjut pada pernyataan sesudah pernyataan yang memicu error.
Referensi#
- GnuCOBOL — Free Software Foundation — Situs proyek GnuCOBOL 3.2, implementasi COBOL sumber terbuka yang dijalankan untuk menghasilkan keluaran pada topik ini.
- GnuCOBOL Manual — Free Software Foundation — Manual resmi GnuCOBOL yang mencakup penggunaan cobc dan pilihan kompilasi program contoh.
- IBM Enterprise COBOL for z/OS documentation — IBM — Dokumentasi resmi tabel nilai FILE STATUS dan pernyataan USE pada COBOL komputer pusat.