1. 導入:なぜSYSTEMキーワードが重要なのか
メインフレームのPL/I開発において、プログラムが予期せぬエラー(ゼロ除算やデータ変換エラーなど)に直面したとき、独自の「ON-Unit(例外ハンドラ)」を記述することは非常に一般的です。しかし、特定の処理だけを一時的にキャッチし、それ以外は「いつものOSの標準的な処理(アベンド処理など)に任せたい」というケースも多々あります。そんな時、標準の挙動へ戻すための重要な鍵となるのが「SYSTEM」キーワードです。これを理解することで、デバッグ効率が上がり、プログラムの堅牢性を保つことができます。
2. 基礎知識:ON-UnitとSYSTEMの役割
PL/Iでは、エラーが発生した際の振る舞いを「ONステートメント」で定義します。これをON-Unitと呼びます。通常、一度ON-Unitを定義すると、そのブロック内では自作のエラー処理が優先されます。しかし、デバッグの過程で「一時的にエラーを拾ったけれど、やはり最後はOSに落としてログを出させたい」という場面が出てきます。ここでSYSTEMを指定すると、PL/Iが独自に行う処理を中断し、システム本来のデフォルト動作(エラーログ出力や異常終了)へ制御を委譲することができます。現代の言語でいう「例外の再スロー(throw)」に近い概念だと考えてください。
3. 実装・解決策
具体的な手順は非常にシンプルです。ONステートメントの後に「SYSTEM」と記述するだけです。これにより、それまで有効だったON-Unitの定義を事実上無効化し、システム標準の処理を呼び出します。特に、特定の範囲だけでエラーハンドリングを行い、それが終わったら元に戻すという制御構造を作る際に非常に役立ちます。
4. サンプルプログラム
以下のコードは、ある処理の間だけエラーを独自に検知し、その後はSYSTEMキーワードを使って標準の動作に戻す例です。
/ サンプル:ON-Unitの切り替え /
PROCEDURE OPTIONS(MAIN);
/ 1. まず標準の動作を定義しておく /
ON ERROR SYSTEM;
/ 2. 一時的に独自ハンドラを有効にする /
ON ERROR BEGIN;
PUT SKIP LIST('独自のエラー処理を実行します');
/ 何らかのログ出力などの処理をここに記述 /
/ 3. 処理が終わったらシステム標準の挙動に戻す /
ON ERROR SYSTEM;
END;
/ 意図的にゼロ除算エラーを発生させる /
DCL X FIXED BIN(15) INIT(0);
DCL Y FIXED BIN(15);
Y = 10 / X;
END;
5. 応用・注意点:現場で陥りやすいバグの回避策
現場でよくある失敗は、「SYSTEMで戻したつもり」になっていて、エラーが二重にキャッチされてしまうケースです。PL/IのON-Unitは、一度定義するとプログラムのスコープ内で有効であり続けるため、必ずON ERROR SYSTEMを実行してハンドラを「リセット」する習慣をつけてください。
また、SYSTEMキーワードを使用すると、プログラムは即座にOSの管理下に戻ります。もし独自ハンドラ内で「エラーを握りつぶしてプログラムを続行させる」ような設計を行いたい場合は、SYSTEMを使わずに「GOTO文」や「リトライ処理」を検討する必要があります。基本的には、致命的なエラーを安全にOSへ引き渡すための「安全装置」として使用するのがベストプラクティスです。

コメント