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の結果をログへ確実に記録するルールを徹底しましょう。

コメント