導入:なぜプログラムの終了値が重要なのか
COBOLで開発を行っていると、プログラムが正常に終わったのか、それともエラーで終わったのかをOSや呼び出し元のシェルスクリプトに伝えたい場面が多々あります。かつてはRETURN-CODEという特殊レジスタに値を代入してから終了するのが一般的でしたが、モダンCOBOLではもっとシンプルに、終了命令そのものに値を記述できるようになりました。これが「STOP RUN RETURNING」文です。コードの意図が明確になり、バグの混入を防ぐ重要なテクニックです。
基礎知識:リターンコードとは何か
リターンコード(終了ステータス)とは、プログラムが終了する際にOSへ送る「結果報告」のようなものです。一般的に「0」は正常終了を意味し、それ以外の数値(1や8など)はエラーや警告を意味します。シェルスクリプト側では、この値を見て「次の処理に進むべきか」「エラーログを出力すべきか」を判断します。これまでのようにレジスタを操作する方法は、コードのあちこちで値が書き換わるリスクがありましたが、新しい書き方は「この時点で、この値を返して終わる」という宣言ができるため、非常に安全です。
実装:RETURNING句の使い方
実装方法は非常に簡単です。「STOP RUN」の後に「RETURNING」を書き、その後にOSへ返したい数値を指定するだけです。数値だけでなく、符号付き整数を持つデータ項目を指定することも可能です。これにより、プログラム内の複雑な分岐に応じて、動的に終了コードを変化させることができます。
サンプルプログラム
以下のコードは、入力値に応じて異なるリターンコードを返す例です。
IDENTIFICATION DIVISION.
PROGRAM-ID. SAMPLE-RET.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-STATUS-CODE PIC 9(01) VALUE 0.
PROCEDURE DIVISION.
> 正常終了のケース
MOVE 0 TO WS-STATUS-CODE.
DISPLAY “処理は正常に完了しました。”
STOP RUN RETURNING WS-STATUS-CODE.
> エラー発生のケース(実際には条件分岐でここを通る)
> ここでは意図的にエラーコード8を返して終了
MOVE 8 TO WS-STATUS-CODE.
DISPLAY “エラーが発生したため処理を中断します。”
STOP RUN RETURNING 8.
> ※注意:STOP RUN以降の処理は実行されません
END PROGRAM SAMPLE-RET.
応用・注意点:現場で陥りやすい罠
この機能を使う際に注意すべき点は、「呼び出し元がその値を正しく解釈できるか」という点です。例えば、古いジョブ制御言語(JCL)やシェルスクリプト側でリターンコードのチェックが適切に行われていないと、プログラムがエラーで終わったのに「正常」と見なされて後続処理が走ってしまう危険があります。また、RETURNINGに指定する値はOSによって制限がある場合があるため(通常は0~255の範囲が安全)、あらかじめ運用ルールを確認しておくことが、ベテラン技術者としての嗜みです。コードの可読性を高めるために、エラーコードは定数(88レベルなど)として定義しておくと、より保守性の高いプログラムになりますよ。

コメント