PL/Iの「ON ZERODIVIDE」で学ぶ!ゼロ除算を優雅に乗り切る例外処理術
こんにちは。メインフレームの世界へようこそ!
JavaやCOBOLでバリバリ開発してきた皆さんにとって、PL/Iという言語は少し「古風で堅苦しい」印象があるかもしれませんね。でも、実はPL/Iは非常に強力で、現代の言語にも負けない柔軟な例外処理の仕組みを持っているんです。
今日はその中でも、開発者が一度は必ず遭遇する「ゼロ除算(ZERODIVIDE)」という壁を、プログラムを止めずに華麗に回避する方法を解説します。
そもそも、PL/Iの「プログラム構造」って?
まず、PL/Iの基本の骨組みを確認しましょう。PL/Iは `PACKAGE` や `PROCEDURE` という単位で構成されます。
- PACKAGE: 複数の手続きをまとめる大きな箱のようなもの。
- PROCEDURE OPTIONS(MAIN): これがプログラムの入り口(エントリーポイント)です。「ここから処理が始まりますよ!」という目印ですね。
COBOLの `IDENTIFICATION DIVISION` ほど厳格ではありませんが、この構造がプログラムの背骨になります。
—
ゼロ除算は「例外」ではなく「イベント」
他の言語では `try-catch` ブロックでエラーを囲みますよね。しかし、PL/Iには `ONユニット` という、一歩引いたところから事態を見守る「監視員」のような仕組みがあります。
「ゼロで割ったらシステムダウン!」とパニックになるのではなく、「ゼロで割ろうとしたら、この処理を実行してね」とあらかじめ予約しておくイメージです。
実装例:ON ZERODIVIDE でリカバリする
それでは、実際のコードを見てみましょう。
1
TEST_CALC: PROCEDURE OPTIONS(MAIN);
/ ゼロ除算が発生した時のための「お守り」を設置 /
ON ZERODIVIDE BEGIN;
PUT SKIP LIST(‘警告: ゼロ除算が発生しました。結果を0として継続します。’);
RESULT = 0; / 救済措置として0を代入 /
GOTO CONTINUE_PROCESS; / 処理を正常なルートへ戻す /
END;
DECLARE (DIVIDEND, DIVISOR, RESULT) FIXED DECIMAL(15,2);
DIVIDEND = 100;
DIVISOR = 0; / ここでゼロ除算が発生! /
/ 本来ならここで異常終了するはずの演算 /
RESULT = DIVIDEND / DIVISOR;
CONTINUE_PROCESS:
PUT SKIP LIST(‘計算結果は:’ || RESULT);
RETURN;
END TEST_CALC;
コードのポイント解説
1. `ON ZERODIVIDE`: これが「監視員」の宣言です。プログラムのどこかでゼロ除算が発生すると、自動的にこのブロックに制御が飛びます。
2. `BEGIN; … END;`: 複数の処理を一つの塊として実行するためのブロックです。
3. `GOTO CONTINUE_PROCESS`: ここが少しレガシーらしいところですね。ONユニット内で処理を補正した後、元のプログラムの続き(`CONTINUE_PROCESS`ラベル)へジャンプして復帰させています。
—
初学者が躓きやすい「データ属性」の魔法
PL/Iが少し難しく感じる原因の一つに、`FIXED DECIMAL` や `PICTURE` といった独特の型宣言があります。
- `FIXED DECIMAL(15,2)`: 「15桁のうち2桁を小数部に使う」という指定です。COBOLの `PIC S9(13)V99` に近いですね。
- なぜこの型なのか?: 金融系システムでは、浮動小数点(Float)を使うと計算誤差が発生して大問題になります。そのため、PL/Iでは固定小数点型を使って「1円のズレも許さない」精密な計算を行うのが定石なのです。
—
まとめ:怖がる必要はありません
PL/Iの `ONユニット` は、まるで「優秀な秘書」のような存在です。メインフレームという厳しい環境だからこそ、異常事態に備えて「どうリカバリするか」をあらかじめプログラム側に記述しておく。この「先読みの精神」こそが、堅牢な基幹システムを支えているんです。
もし現場で `ZERODIVIDE` のエラーにぶつかったら、「おっと、これはこのプログラムに『お守り』を付けてあげれば解決するな」と余裕を持って考えてみてください。
一つずつ紐解いていけば、PL/Iはとっても親切で頼りになる相棒になりますよ!
また分からないことがあれば、いつでも聞きに来てくださいね。現場のシステムアーキテクトとして、いつでもお待ちしています!
