【PL/I学習|実務向け】PL/I開発者が知るべきONCODEによる例外制御の勘所

導入

メインフレームのPL/I開発において、プログラムの堅牢性を左右するのは「いかに予期せぬエラーをスマートに捌くか」です。特に、ファイル入出力エラーや変換エラーが発生した際、単にジョブを異常終了させるのではなく、原因に応じた適切なリカバリ処理を行うために欠かせないのが組み込み関数「ONCODE」です。本稿では、ONCODEを活用した例外処理の基本と、現場で役立つ実装テクニックを解説します。

基礎知識

PL/Iにおける例外処理は、ONステートメントを用いて「ON-Unit(例外ハンドラ)」を定義することで実現します。ONCODEは、そのON-Unit内で呼び出される関数であり、発生したエラーの「詳細なシステムコード」を整数値で返します。例えば、ファイル操作でエラーが起きた際、それが「ファイルが存在しない(80)」のか、「レコード長が規定と合わない(92)」のかを判別する唯一の手がかりとなります。これにより、汎用的なエラーメッセージではなく、原因に応じた具体的なログ出力やデータ補正が可能になります。

実装/解決策

ONCODEを効果的に使うための鍵は、ONステートメントのスコープ管理と、コード番号に基づいた分岐ロジックの整理です。まずは対象となる条件(CONDITION)に対してON-Unitを定義し、その内部でONCODEを評価します。注意すべき点は、ONCODEの値がシステムやアーキテクチャに依存する可能性があることです。そのため、コード内では「マジックナンバー」を直接比較するだけでなく、定数として定義して可読性を高めるのが実務上のベストプラクティスです。

サンプルプログラム

以下は、ファイル入出力エラーを検知し、ONCODEに基づいて処理を分岐させる実装例です。

/ ファイル入出力時の例外ハンドラ定義例 /
ON UNDEFINEDFILE(MY_FILE) BEGIN;
DCL ERR_CODE FIXED BIN(31);
ERR_CODE = ONCODE(); / 現在発生しているエラーコードを取得 /

IF ERR_CODE = 80 THEN DO;
/ ファイル不在時のリカバリ処理 /
PUT SKIP LIST(‘警告: ファイルが見つかりません。デフォルト値で継続します。’);
END;
ELSE IF ERR_CODE = 92 THEN DO;
/ レコード長不一致時のエラー出力 /
PUT SKIP LIST(‘致命的エラー: レコード定義が不正です。コード:’ || ERR_CODE);
SIGNAL ERROR; / 呼び出し元へエラーを波及させる /
END;
ELSE DO;
PUT SKIP LIST(‘予期せぬエラー発生:’ || ERR_CODE);
END;
END;

OPEN FILE(MY_FILE);

応用・注意点

現場で陥りやすい罠として、ON-Unit内での無限ループがあります。ON-Unit内で発生したエラーを適切に処理せず、再び同じON-Unitを呼び出すようなコードを書くと、デバッグが困難な無限ループに陥ります。

また、現代的な言語へのマイグレーションを視野に入れている場合、このONCODEによる分岐ロジックは「負の遺産」になりがちです。移行時は、単に数値比較を移植するのではなく、エラーコードを「ファイル不在」「権限エラー」といった意味のある定数やクラスにマッピングし直す作業を行ってください。そうすることで、将来的にJavaやC#へ移行する際、例外クラスへの変換がスムーズになります。常に「このエラーは業務的にどう解釈すべきか」という視点を持つことが、保守性の高いコードを書く秘訣です。

コメント

タイトルとURLをコピーしました