PL/Iの「転ばぬ先の杖」:ON CONVERSIONでデータ変換エラーを華麗にいなす技術
こんにちは!メインフレームの世界へようこそ。
JavaやCOBOLの経験がある方にとって、PL/I(ピーエル・アイ)という言語は、まるで「自由すぎて逆に怖い」という独特のオーラを放っているかもしれません。
特にデータ変換。例えば「数字が入っているはずの文字列に、なぜかゴミデータ(スペースや記号)が混じっている」。COBOLなら `NUMERIC` チェックで事前に弾くのが鉄則ですが、PL/Iには、もっとスマートで、かつ少しだけ「魔法」じみたエラーハンドリングの仕組みがあります。
それが、今回解説する `ON CONVERSION` です。
—
1. なぜPL/Iは「データ変換」で止まるのか?
PL/Iのデータ宣言は、非常に柔軟です。しかし、その柔軟さゆえに、コンピュータは「あれ?これ数字として扱えって言われたけど、中身が『A』なんだけど!どうすればいいの?」とパニックを起こしてしまいます。
これをそのまま放置すると、プログラムは異常終了(ABEND)という名の「強制終了」をくらってしまいます。夜間バッチでこれが起きると、オペレーターさんから深夜の呼び出しコールがかかってくる……なんていうのは、メインフレーム現場の「あるある」ですよね。
そこで登場するのが、ONユニット(ON CONVERSION) です。これは、「もし変換に失敗したら、その時はこの処理を実行してね」と、あらかじめコンピュータに伝えておく「予約ルール」のようなものです。
—
2. 実践!ON CONVERSIONの実装例
まずは、実際のコードを見てみましょう。百聞は一見に如かず、です。
1
/ メインプログラムの始まり /
TEST_CONV: PROCEDURE OPTIONS(MAIN);
/ 文字列から数値へ変換する変数たち /
DCL INPUT_DATA CHAR(5) INIT(’12A45′); / わざと無効な文字を混入 /
DCL NUM_VAL FIXED DEC(5); / 数値を入れる変数 /
/ コンバージョンエラーが発生した時の「お守り」をセット /
ON CONVERSION BEGIN;
/ 変換に失敗した時の処理をここに書く /
PUT SKIP LIST(‘警告: データ変換失敗を検知。デフォルト値0で補完します。’);
/ エラー箇所を強制的に0に置き換えて処理を続行させる魔法 /
NUM_VAL = 0;
/ 処理を戻る(ここがポイント!) /
GO TO RECOVER;
END;
/ 変換を試みる /
NUM_VAL = INPUT_DATA;
RECOVER:
/ 結果の出力 /
PUT SKIP LIST(‘結果の値は: ‘ || NUM_VAL);
END TEST_CONV;
このコードのポイント
- `ON CONVERSION BEGIN … END;`: これが「エラー監視のバリア」です。この記述がある間、プログラムは変換エラーに対して「パニック」ではなく「このブロックの実行」を選択するようになります。
- `GO TO RECOVER`: これが少しレガシーな書き方ですが、エラー発生地点から「正気を取り戻した地点(ラベル)」へ強制的にジャンプさせる制御です。PL/Iらしい、非常に直接的な解決策ですね。
—
3. 初心者の方に知っておいてほしい「心構え」
PL/Iを扱う上で、皆さんに一つだけ覚えておいてほしいことがあります。それは、「ONユニットはプログラムのどこに書いてもいいが、スコープ(有効範囲)がある」ということです。
- プログラム全体で有効にしたいなら: `MAIN` プロシージャの冒頭に書くのが定石です。
- 特定の処理だけ監視したいなら: そのブロック内だけに書くことも可能です。
この「エラーを隠蔽する」というやり方は、乱用しすぎると「どのデータがどこで壊れていたのか」が見えなくなってしまうというリスクもあります。そのため、必ず `PUT SKIP LIST` などでログを出し、「何が起きたか」を証拠として残すことが、プロとしての現場の作法になります。
—
最後に:怖がらなくて大丈夫です!
「PL/Iは難しい」と言われがちですが、実はこのように「エラーが起きたらこうする」という道筋をプログラマが明示的に書ける、非常に親切な言語でもあります。
COBOLのようにガチガチにルールで縛るのではなく、PL/Iは「失敗した時のリカバリさえしっかり書けば、あとは任せるよ」と言ってくれる、懐の深い言語なんです。
もし皆さんの現場で、「この変換、たまにゴミデータが来て落ちるんだよね……」というプログラムを見かけたら、ぜひこの `ON CONVERSION` を思い出してみてください。きっと、皆さんのバッチ運用がぐっと楽になるはずです。
それでは、また次回のレガシー探訪でお会いしましょう!質問があれば、いつでもコメント欄に投げてくださいね。
