COBOL言語の「USE文」の使い方について理解しよう! | 用語辞典

COBOL(コボル)言語の予約語「USE」を使用した入出力エラー処理指定とは

辞典・辞書-USE-イメージ

COBOL(コボル)言語のUSE文とは?

COBOL言語のUSE文には、入出力処理でエラーが発生した場合に、プログラムが実行する処理を指定する機能があります。

COBOL言語のプログラムで入出力処理を行うと、予期しないエラーが発生することがあります。エラーが発生すると、システムが用意している標準的なエラー処理が行われますが、その多くはプログラムが異常終了したり、異常な動作を継続したりと、原因を突き止めるのに十分な情報を得られるものではありません。

しかし、USE文を使ってエラー発生時の処理を指定することにより、エラー情報の出力や、リカバリ処理などを行うことができます。

USE文の形式

USE文は、手続き部の宣言部分に記述します。

■書式

USE AFTER STANDARD 異常事象指定 PROCEDURE ON 適応対象.

■構文規則

<異常事象指定>

「EXCEPTION」または「ERROR」を記述します。「EXCEPTION」と「ERROR」は、どちらを記述しても同じ動作をしますので、どちらを記述してもかまいません。

<適応対象>

USE文で指定する手続き(命令群)を適用する動作、またはファイル名を記述します。

「INPUT」、「OUTPUT」、「O-I」、「ファイル名」のどれか1つを記述してください。

動作「INPUT」を記述すると、入力処理でエラーが発生した場合に、動作「OUTPUT」を記述すると出力処理でエラーが発生した場合に、動作「O-I」は入出力処理でエラーが発生した場合に、「ファイル名」は当該ファイルのアクセス処理全般でエラーが発生した場合に、USE文で指定した処理が行われます。

■使用例

USE文を使用して、ファイルアクセスエラー発生時の処理を行うプログラム例をご紹介します。

プログラム例は、コンソールからレコードキーの値を入力し、索引順編成ファイル「SHOHIN-INDX」の当該レコードを読み出し表示しています。

辞典・辞書-USE-使用例

■索引順編成ファイル「SHOHIN-INDX」のレコード様式とレコード内容

索引順編成ファイル「SHOHIN-INDX」は、3桁の製品コード(キー)の昇順に並び、「A01」~「A05」までが登録されています。

製品コード
3桁

製品名
10桁

製品価格
4桁

レコード1:A01りんご 0300

レコード2:A02めろん 1000

レコード3:A03みかん 0200

レコード4:A04ばなな 0180

レコード5:A05いちご 0800

■実行結果

はじめに製品コードの入力を促すメッセージが表示されます。

辞典・辞書-USE-実行結果

存在する製品コード「A01」を入力してみます。

辞典・辞書-USE-入力例

製品コード「A01」のレコード内容が表示され、プログラムが終了しました。

もう一度、プログラムを実行し、今度は存在しない製品コード「A00」を入力してみます。

辞典・辞書-USE-入力例

USE文で指定したエラーメッセージが表示され、プログラムが終了しました。

USE文のCOBOL(コボル)言語における基本事項やルールについて

USE文は、手続き部の宣言部分の「DECLARATIVES」と「END-DECLARATIVES」の間に記述します。

USE文自身は、実行される命令文ではなく、USE文で指定した手続き(命令群)の実行条件を指定するものです。実行条件が満たされると、指定した手続き(命令群)が実行されたのち、プログラムの制御は、実行条件が発生した命令の直後に戻ります。

USE文で指定した手続き(命令群)は、システムが用意した標準のエラー処理のあとに実行されます。また、READ文などでINVALID KEY句などが指定されていると、当該事象以外のエラーが発生した場合に、USE文で指定した手続き(命令群)が実行されます。

COBOL(コボル)言語のUSE文を使うときの注意点

USE文を記述した節から、明示的に異なる節へ制御を移すことはできません。

例えば、「COBOL(コボル)言語のUSE文とは?」のプログラム例では、USE文で指定したエラー処理(エラーメッセージの表示)を行ったのち、プログラムを終了したいと思っても、57行目のEND-PROC(終了処理)にGO TOでジャンプすることはできません。USE文で指定したエラー処理の中でエラーフラグを立て、制御が戻った先でエラーフラグを確認するなどして、以後の動作を制御する必要があります。

USE文を使ったCOBOL(コボル)プログラムの活用方法

USE文で指定した手続き(命令群)を、USE文の実行条件が満たされたとき以外にも実行したい場合、PERFORM文でのみ実行することができます。

では、「COBOL(コボル)言語のUSE文とは?」でご紹介したプログラム例をベースに、ファイルのオープン時のエラーは致命的なエラーとしてプログラムを終了し、読み込みで該当キーなしの場合は、PERFORM文でエラー処理を行い、キーを再入力するプログラムを作成してみましょう。

「COBOL(コボル)言語のUSE文とは?」でご紹介したプログラム例からの変更箇所は、赤のマーカー部分です。マーキングをしていませんが、コンソールのメッセージ表示&入力処理と、ファイルのオープン処理の順番が入れ替わっていることにもご注意ください。

   
  1. ******************************************************************
  2. * Author:
  3. * Date:
  4. * Purpose:
  5. * Tectonics: cobc
  6. ******************************************************************
  7. IDENTIFICATION DIVISION.
  8. PROGRAM-ID. USE_SAMPLE2.
  9.  
  10. ENVIRONMENT DIVISION.
  11. INPUT-OUTPUT SECTION.
  12. FILE-CONTROL.
  13. SELECT IN-FILE ASSIGN TO "SHOHIN-INDX"
  14. ACCESS MODE IS RANDOM
  15. ORGANIZATION IS INDEXED
  16. RECORD KEY IS IN-CODE.
  17.  
  18. DATA DIVISION.
  19. FILE SECTION.
  20. FD IN-FILE.
  21. 01 IN-REC.
  22. 03 IN-CODE PIC X(03).
  23. 03 IN-HINMEI PIC X(10).
  24. 03 IN-KAKAKU PIC 9(04).
  25.  
  26. WORKING-STORAGE SECTION.
  27. 01 WORKING-AREA.
  28. 03 CNSL-INPUT PIC X(03).
  29. 03 ERR-FLAG PIC 9(01).
  30.  
  31. *-------------------------------------------
  32. * 主手続
  33. *-------------------------------------------
  34. PROCEDURE DIVISION.
  35.  
  36. DECLARATIVES.
  37. ERROR-PROC SECTION.
  38. USE AFTER STANDARD ERROR PROCEDURE ON IN-FILE.
  39. MOVE 1 TO ERR-FLAG.
  40. DISPLAY "FILE ACCESS ERROR !!".
  41. END DECLARATIVES.
  42.  
  43. MAIN SECTION.
  44. MAIN-PROCEDURE.
  45. * ファイルオープン
  46. OPEN INPUT IN-FILE.
  47. IF ERR-FLAG <> ZERO THEN
  48. GO TO END-PROC2
  49. END-IF.
  50.  
  51. CONSOLE-INPUT-PROC.
  52. * メッセージ表示&入力
  53. MOVE SPACE TO CNSL-INPUT.
  54. MOVE ZERO TO ERR-FLAG.
  55. DISPLAY "製品コード(3桁)を入力してください".
  56. ACCEPT CNSL-INPUT FROM CONSOLE.
  57.  
  58. * レコード読み出し&表示
  59. MOVE CNSL-INPUT TO IN-CODE.
  60. READ IN-FILE
  61. INVALID KEY
  62. PERFORM ERROR-PROC
  63. GO TO CONSOLE-INPUT-PROC
  64. END-READ.
  65. IF ERR-FLAG <> ZERO THEN
  66. GO TO END-PROC1
  67. END-IF.
  68. DISPLAY IN-REC.
  69.  
  70. *終了処理
  71. END-PROC1.
  72. CLOSE IN-FILE.
  73. END-PROC2.
  74. STOP RUN.
  75.  
  76. END PROGRAM USE_SAMPLE2.

■実行結果

はじめに索引順編成ファイル「SHOHIN-INDX」を「SHOHIN-INDX2」にリネームしておき、プログラムを実行します。

辞典・辞書-USE-実行結果

エラーメッセージが表示され、プログラムが終了しました。

次に、リネームしたファイル名を元の「SHOHIN-INDX」に戻して、プログラムを実行します。

辞典・辞書-USE-入力例

製品コードの入力を促すメッセージが表示されましたので、存在しない製品コード「A00」を入力してみます。

辞典・辞書-USE-入力例

エラーメッセージが表示され、再入力が促されました。

存在する製品コード「A01」を入力します。

辞典・辞書-USE-入力例

製品コード「A01」のレコードが表示され、プログラムが終了しました。

USE文による、エラーハンドリング処理は、実務でもよく使用されるCOBOLプログラムの基本的なテクニックです。ぜひ、使い方を覚えておきましょう。

この記事を読んだ人は、こちらの記事も読んでいます

【未経験者歓迎】COBOLプログラマー・システムエンジニアの募集

株式会社COBOLの求人・転職・募集情報を見る

COBOL入門のカテゴリー

取引企業様 募集中
COBOL技術者 募集
COBOL魂
読者採用
COBOL入門