PL/Iの「ON CONDITION」でエラー処理をスマートに!――例外処理の奥義を紐解く
皆さん、こんにちは。メインフレームの世界へようこそ。
JavaやCOBOLでバリバリ開発してきた方にとって、PL/I(ピーエル・ワン)は少し「古風で難解な異世界」に見えるかもしれません。確かに、ポインタやストレージ制御など、現代の言語が隠蔽してしまった部分が剥き出しになっているのは事実です。
でも、安心してください。PL/Iは非常にパワフルで、一度仕組みを理解してしまえば、これほど「痒い所に手が届く」言語は他にありません。
今日は、その中でも「独自の例外を自作して、一箇所でスマートに処理する」という、PL/Iならではの非常にエレガントな機能、`ON CONDITION`についてお話しします。
—
1. なぜ「SIGNAL CONDITION」を使うのか?
Javaで言えば`throw new Exception()`、COBOLで言えばエラーフラグを立てて延々と`IF`文で判定するような処理を、PL/Iでは「シグナルを投げる」という洗練されたやり方で行います。
例えば、バッチ処理の中で「入力データが業務ルールに違反している」という事態が発生したとします。いちいち深い階層の関数からエラーフラグを呼び出し元に戻すのは大変ですよね?
PL/Iでは、プログラムのどこからでも「おい!エラーが起きたぞ!」と通知(SIGNAL)を投げ、それをあらかじめ用意しておいた「受信機(ON文)」で一括キャッチできるんです。
2. 実践!「ON CONDITION」の書き方
まずは、基本構造を見てみましょう。このプログラムは、`MAIN`プロシージャという「入り口」から始まります。
/i
/ メインプログラムの定義 /
MY_BATCH_JOB: PROCEDURE OPTIONS(MAIN);
/ 1. ユーザー定義の例外「BAD_DATA」を捕まえる準備(受信機) /
ON CONDITION(BAD_DATA) BEGIN;
PUT SKIP LIST(‘警告: 業務エラーを検知しました。ログを出力して終了します。’);
/ ここでロールバック処理やログ書き込みを集中管理できる /
STOP;
END;
/ メインロジックの呼び出し /
CALL VALIDATE_INPUT;
VALIDATE_INPUT: PROCEDURE;
DCL INPUT_VAL FIXED BIN(15) INIT(999);
/ 2. もしデータが不正なら、即座に例外を投げる /
IF INPUT_VAL > 100 THEN
SIGNAL CONDITION(BAD_DATA);
PUT SKIP LIST(‘正常処理が完了しました’);
END VALIDATE_INPUT;
END MY_BATCH_JOB;
このコードのポイント
- `ON CONDITION(名前)`: これが受信機です。プログラムの先頭に近い場所で宣言しておくと、その有効範囲(スコープ)内で発生した通知をすべて拾ってくれます。
- `SIGNAL CONDITION(名前)`: これが「投げる」行為です。どこからでも「エラーだ!」と叫べます。
- `BEGIN; … END;`: `ON`文の中では、単なる一行の命令だけでなく、複数の処理をブロックとして記述できるのが非常に便利です。
—
3. なぜ「怖い」と感じるのか?(そして実は怖くない理由)
初めて見る方は、「`SIGNAL`なんて使ったら、プログラムがどこに飛ぶかわからなくなるのでは?」と不安になるかもしれません。
確かに、制御フローが飛躍するのは「スパゲッティコード」の元……と教わることが多いですよね。ですが、この機能は「正常系」と「異常系」を明確に分離できるというメリットが絶大です。
- COBOLの場合: 戻り値チェックをすべての呼び出し先で行う必要があり、ロジックが`IF`文で埋め尽くされます。
- PL/Iの場合: 「例外が起きた時の処置」を`ON`文という独立した箱に閉じ込めるため、メインの処理ロジックが驚くほどスッキリします。
4. 知っておくべき「データ宣言」の小さなコツ
PL/Iを扱う上で避けて通れないのがデータ宣言(`DCL`)です。
/i
DCL MY_VALUE FIXED BIN(31) INIT(0);
- `FIXED BIN(31)`: Javaの`int`に近い、符号付き32ビット整数です。
- `CHAR(10)`: 固定長文字列です。
- `VARYING`: これを付けないと、`CHAR(10)`は必ず10文字分として扱われます。足りない分はスペースで埋められます(これがCOBOLerには馴染み深い仕様ですね)。
これらの属性は、メモリ上にどう配置されるかを制御しています。PL/Iは「メモリの配置を意識させる」言語ですが、裏を返せば「ハードウェアの性能を極限まで引き出せる」ということでもあります。
—
最後に:PL/Iはあなたの味方です
PL/Iは、一見するとキーワードが多くて難しそうに見えます。でも、今日ご紹介した`ON CONDITION`のように、「複雑な処理をいかにシンプルに、一元的に管理するか」を真剣に考え抜いて設計された、非常に理にかなった言語です。
「難しそうだな」と思ったら、まずは小さなサンプルを書いて、実際にコンパイルして動かしてみてください。メインフレームのコンパイラは、エラーメッセージが非常に親切です。
エラーが出ても大丈夫。それはシステムが「もっとこう書けば動くよ!」と教えてくれているサインですから。焦らず、一歩ずつ進んでいきましょう。
また次の記事では、「ポインタと基底変数」というPL/Iの最強の武器についてお話しします。これさえマスターすれば、どんな複雑なデータ構造も怖くありませんよ!
