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

メインフレームの「守護神」:PL/Iでゼロ除算をスマートに捌く方法

こんにちは。メインフレームの深淵へようこそ。
普段JavaやCOBOLに慣れ親しんでいる方にとって、PL/I(ピー・エル・アイ)という言語は、どこか古めかしくて少し近寄りがたい「重鎮」のような存在に見えるかもしれませんね。

でも、安心してください。PL/Iは、非常に論理的で、実はエンジニアの「失敗」を未然に防ぐための強力な武器をたくさん持っています。今回はその中でも、システムを突然死(アベンド)させないための「ON条件(ON-unit)」という機能、特にゼロ除算のハンドリングについて、現場の知恵を交えて紐解いていきましょう。

そもそも「ゼロ除算」って何が怖いの?

COBOLやJavaで、変数の値が予期せず「0」になってしまい、計算結果を割ろうとしてシステムが停止した経験はありませんか? メインフレームのバッチ処理において、夜中に計算エラーでプログラムが落ちることは、運用担当者にとって最も避けたい事態です。

PL/Iでは、`ON ZERODIVIDE` という魔法の呪文を使います。これは、「ゼロ除算が発生した瞬間に、プログラムを殺さずに別の処理へジャンプさせる」という、いわばシステムの「セーフティネット」です。

コードで見る「賢いエラーハンドリング」

百聞は一見に如かず。まずは、PL/Iの基本構造の中で、どのようにこの保護機能が働くのかを見てみましょう。

/i
EXAMPLE: PACKAGE; / プログラムの大きな箱の始まり /

/ メイン処理の入り口 /
MAIN_PROC: PROCEDURE OPTIONS(MAIN);

/ データ宣言:FIXED DEC(5)はCOBOLのPIC 9(5)に近いイメージ /
DCL DIVIDEND FIXED DEC(5) INIT(100);
DCL DIVISOR FIXED DEC(5) INIT(0); / ここが0になる可能性のある変数 /
DCL RESULT FIXED DEC(5);

/ ★ここが重要:ゼロ除算が起きた時の「避難経路」を定義 /
ON ZERODIVIDE BEGIN;
PUT SKIP LIST(‘【警告】ゼロ除算が発生しました!計算をスキップします。’);
RESULT = 0; / 回避策として0を代入しておくなどの処置 /
/ ここで処理を終了させることも可能 /
END;

/ 計算処理 /
RESULT = DIVIDEND / DIVISOR;

PUT SKIP LIST(‘計算結果は: ‘ || RESULT);

END MAIN_PROC;

END EXAMPLE;

このコードのポイント

  • `ON ZERODIVIDE`: これを書くだけで、システムは「次にゼロで割るようなことが起きても、アベンドせずココに来い」と学習します。
  • `BEGIN; … END;`: 複数の処理をまとめて実行するためのブロックです。ログ出力だけでなく、エラーテーブルへの書き込みや、担当者へのメール通知などもここに書くことができます。
  • `OPTIONS(MAIN)`: これがそのプログラムの「入り口」であることをOSに伝えます。この宣言がないと、バッチのジョブから呼び出せません。

初学者がハマりやすい「PL/Iのクセ」

PL/Iを触り始めると、いくつか「おや?」と思うポイントがあるはずです。少しだけ整理しておきましょう。

1. データ型の柔軟性: PL/Iは `FIXED DEC`(固定小数点)や `FLOAT`(浮動小数点)など、数値表現が非常に多彩です。COBOLのように「桁数」を厳密に定義しつつも、計算はコンピュータ任せにできる柔軟さがあります。
2. セミコロンの重要性: 文の終わりには必ず `;` が必要です。ここを忘れると、コンパイラが「どこまでが命令か分からない!」と悲鳴を上げてエラーを吐き出します。
3. ブロック構造: `PACKAGE` や `PROCEDURE` は「マトリョーシカ」のように入れ子構造にできます。複雑な計算ロジックを小さな関数に分けるのが、メインフレーム流のきれいなコードの書き方です。

最後に:なぜ「ON条件」を使うのか

なぜわざわざ `ON ZERODIVIDE` を書くのでしょうか? `IF DIVISOR = 0 THEN …` と書けばいいのでは?と思うかもしれません。

確かに単純な比較なら `IF` 文でもいいでしょう。しかし、メインフレームのような大規模なシステムでは、複数の計算が複雑に入り組んでいます。あらゆる箇所に `IF` を書くとコードがスパゲッティ化してしまいます。

`ON ZERODIVIDE` は、「ロジック本体には計算の美しさを保たせ、例外処理は別口で管理する」という、非常にモダンなプログラミング思想に近いアプローチなのです。

皆さんの現場でも、ぜひ「守護神」であるON条件を配置して、夜間のバッチ実行を安心して見守れるシステムを作ってみてください。何か詰まったら、いつでもまた聞きに来てくださいね。応援しています!

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