【PL/I学習|実務向け】PL/I例外処理の要:ONFILE組み込み関数でファイルエラーを特定する

1. 導入

メインフレームのPL/I開発において、大規模なバッチ処理を行う際、ファイルオープンエラーや入出力エラーは避けて通れません。特に、共通の例外処理ルーチン(ON-Unit)で複数のファイルを監視している場合、「どのファイルでエラーが発生したか」を特定できなければ、ログ調査は難航を極めます。本記事では、例外発生時にファイル名を動的に取得できる「ONFILE組み込み関数」の活用方法と、実務でのログ出力の勘所を解説します。

2. 基礎知識

PL/IにおけるON-Unitとは、特定の条件下(ERROR、UNDEFINEDFILEなど)でプログラムが中断される代わりに制御を移すための仕組みです。
ONFILE関数は、これらのON-Unit内で呼び出される「組み込み関数」です。この関数を呼び出すと、エラーを引き起こしたファイル名が文字列として返されます。現代のオブジェクト指向言語でいう「例外オブジェクトのfileName属性」に相当するもので、システム側が保持しているエラーコンテキストにアクセスするための重要なインターフェースです。

3. 実装/解決策

実務では、各ファイルごとにON-Unitを書くのではなく、一つの共通モジュールや上位ブロックでON-Unitを定義し、そこでONFILE関数を使用してログ出力を行う手法が推奨されます。これにより、メンテナンス性が向上し、エラー処理の記述漏れを防ぐことができます。

4. サンプルプログラム

以下は、ファイルオープン失敗時に、どのファイルが原因かを特定してログを出力するコード例です。

/ 共通エラー処理のサンプル /
ON UNDEFINEDFILE(INFILE1) BEGIN;
/ エラーが発生したファイル名を取得 /
DCL ERR_FILE CHAR(20);
ERR_FILE = ONFILE();

/ エラーログに出力 /
PUT SKIP LIST(‘【エラー発生】ファイルオープンに失敗しました’);
PUT SKIP LIST(‘対象ファイル名: ‘ || ERR_FILE);

/ 異常終了処理へ移行 /
STOP;
END;

/ ファイルの宣言 /
DCL INFILE1 FILE RECORD INPUT;
OPEN FILE(INFILE1);

5. 応用・注意点

実務でONFILEを使用する際には、以下の点に注意してください。

・ON-Unit内での再帰的なエラーの回避
ON-Unitの中でさらにファイル操作を行うと、それが原因で再びUNDEFINEDFILEが発生し、無限ループに陥る可能性があります。ログ出力は可能な限りSYSPRINTへの出力に留め、複雑な処理はON-Unitの外で行う設計にしてください。

・空白文字の扱い
ONFILE関数が返す値は、宣言されたファイル名がそのまま戻ります。環境や定義によっては右側に空白が含まれる場合があるため、ログに出力する際はTRIM関数などを併用して整形することをお勧めします。

・デバッグの効率化
例外発生時に「どのファイルか」がログに明記されているだけで、保守担当者の調査時間は大幅に短縮されます。本番環境の運用設計において、ONFILEの結果をログへ確実に記録するルールを徹底しましょう。

コメント

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