Status Berkas dan Deklaratif

FILE STATUS dua digit dan prosedur DECLARATIVES untuk penanganan kesalahan berkas yang terpusat.

Daftar isi

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 pertamaKelas hasil
0Operasi berhasil
1Kondisi at end, yaitu READ telah mencapai akhir berkas
2Kondisi kunci pada berkas terindeks atau relatif
3Error permanen, misalnya berkas tidak ada saat dibuka
4Error logika, misalnya berkas dibaca padahal tidak terbuka
9Ditentukan implementasi, biasanya kegagalan tingkat sistem

Kombinasi dua digit yang paling sering ditemui pada kerja berkas dirangkum pada tabel berikut.

NilaiArti
00Operasi berhasil
10Akhir berkas tercapai
23Rekaman yang diminta tidak ditemukan pada pembacaan acak
35Berkas tidak ada saat OPEN untuk INPUT atau I-O
41Berkas sudah terbuka saat OPEN dijalankan
42Berkas sudah tertutup saat CLOSE dijalankan
44Panjang 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.

cobol status.cbl
       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.
text Keluaran
Status pembukaan berkas : 35
Berkas gagal dibuka, program dihentikan

Kompilasi program dengan perintah berikut.

bash
# kompilasi program status berkas
cobc -x status.cbl

Jalankan ./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.

cobol deklaratif.cbl
       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.
text Keluaran
Prosedur deklaratif aktif
Status berkas : 35

Kompilasi program dengan perintah berikut, kemudian jalankan ./deklaratif.

bash
# kompilasi program deklaratif
cobc -x deklaratif.cbl

Pesan 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#