【入門編】ON ZERODIVIDEによるゼロ除算例外のハンドリング – PL/Iの基本構文とデータ制御実践ガイド

PL/Iの「ON ZERODIVIDE」で学ぶ、例外ハンドリングの奥深い世界

こんにちは。メインフレームの世界へようこそ。
普段JavaやCOBOLを触っている方からすると、PL/Iは少し「異質な言語」に見えるかもしれませんね。でも安心してください。PL/Iは1960年代に生まれた言語ですが、その設計思想は非常に哲学的で、一度コツを掴めばこれほど頼りになる相棒はいません。

今日は、PL/Iにおける「ゼロ除算(ZERODIVIDE)」のハンドリングを通じて、この言語特有の「ONユニット」という仕組みを紐解いていきましょう。

1. そもそもPL/Iに「予約語」がないって本当?

PL/Iを初めて触る人が一番驚くのが、「予約語が実質存在しない」という点かもしれません。

例えば、`IF` や `THEN` といったキーワードはありますが、これらは「文脈」によって意味が決まります。つまり、変数名に `IF` や `THEN` と名付けても、コンパイラは文脈から「ああ、これは変数だな」と空気を読んで解釈してくれます。

  • COBOLの場合: 予約語が厳格で、変数名に使えない単語が山ほどあります。
  • PL/Iの場合: 自由度は高いですが、あまりに自由すぎると可読性が落ちるので、「変数名には意味のある名前を付けようね」というのが現場の暗黙の了解です。

2. 算術演算の「事故」を防ぐ:ON ZERODIVIDE

基幹システムのバッチ処理で、計算結果が予期せずゼロになり、プログラムが異常終了(ABEND)してしまった経験はありませんか?

PL/Iには、こうした算術エラーを「なかったこと」のようにスマートに処理する ONユニット という強力な機能があります。

サンプルコード:ゼロ除算を優しく捕まえる

/i
DIVIDE_PROC: PROC OPTIONS(MAIN);

DCL A FIXED BIN(31) INIT(100);
DCL B FIXED BIN(31) INIT(0);
DCL RESULT FIXED BIN(31);

/ ゼロ除算が発生した時の「避難経路」を定義します /
ON ZERODIVIDE
BEGIN;
PUT SKIP LIST(‘警告: ゼロ除算が発生しました。計算をスキップします。’);
RESULT = 0; / 代替値をセットして処理を継続する /
GOTO CONTINUE_PROCESS;
END;

/ ここが計算のメイン部分 /
RESULT = A / B;

CONTINUE_PROCESS:
PUT SKIP LIST(‘プログラムは停止せず、次の処理へ進みます。現在のRESULT:’ || RESULT);

END DIVIDE_PROC;

なぜこの書き方なのか?(解説)

1. ON ZERODIVIDE: この行が現れた時点で、プログラムは「もしゼロ除算が起きたら、あそこのBEGINブロックへ飛べ」というフラグを立てます。
2. BEGIN – END: これは一つの「部屋」です。エラーが発生すると、プログラムの実行地点からこの部屋へ制御がジャンプします。
3. GOTOの活用: ONユニット内で処理を終えた後、どこに戻るかを指定するために `GOTO` を使うのがPL/Iの伝統的なスタイルです。

3. スタックの巻き戻し挙動:ちょっと深いお話

Javaの `try-catch` と似ているようで、PL/IのONユニットは少し違います。Javaが「スコープを抜ける」のに対し、PL/Iは「発生した場所の状況を保持したまま制御を横取りする」イメージです。

もし `ON` 文が別のプロシージャ(関数)の中で定義されていた場合、エラーが発生すると、スタックを遡ってその `ON` 文を探しに行きます。これを「動的スコープ」と呼びます。

  • 初心者のためのアドバイス:

「どこでエラーが起きてもいいように、メインプロシージャの冒頭でONユニットを定義しておく」という手法がよく取られます。これは、いわばシステムの「安全ネット」を張るような作業です。

4. 最後に:怖がらなくて大丈夫です

PL/Iの宣言や制御構造は、一見すると古めかしく感じるかもしれません。しかし、これらは全て「ハードウェアの能力を最大限に引き出し、いかなる状況でも処理を完遂させる」という、当時のメインフレーム技術者の執念が詰まった設計です。

「ONユニット」を使いこなせるようになると、バッチプログラムの堅牢性が劇的に向上します。最初はコードの書き方に戸惑うかもしれませんが、一つずつ紐解いていけば、これほど論理的で美しい言語はありません。

もし現場で「PL/Iのここが理解できない!」という箇所があれば、またいつでも聞きに来てくださいね。あなたのメインフレームライフが、より快適なものになるよう応援しています!

タイトルとURLをコピーしました