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

ゼロ除算も怖くない!PL/Iの「ONユニット」で基幹システムの堅牢性を守る

こんにちは。長年メインフレームの深淵を覗き込んできたシステムアーキテクトです。

JavaやCOBOLからメインフレームの世界へ足を踏み入れた皆さん、ようこそ!PL/Iという言語は、一見すると「大文字ばかりで古臭い」と感じるかもしれません。しかし、この言語は非常に懐が深く、現代のプログラミング言語が持つ「例外処理」の概念を、遥か昔から極めて洗練された形で実装していた言語なんです。

今日は、システム開発で誰もが一度は冷や汗をかく「ゼロ除算(ZERODIVIDE)」を、PL/Iの「ONユニット」を使って優雅に捌く方法を解説します。

そもそも「ONユニット」って何?

Javaでいうところの `try-catch` ブロックをイメージしてください。しかし、PL/Iはもっと独特です。

PL/Iには「ONユニット」という仕組みがあります。これは、「プログラムのどこかで特定のエラーが起きたら、あらかじめ決めておいた処理を横取り(割り込み)して実行する」というものです。

「エラーが起きそうな場所を全部 `if` 文でチェックする」なんて面倒なことは不要です。エラーの監視員をあらかじめプログラムの入り口で待機させておく、そんなイメージです。

基本構造を見てみよう

まずは、PL/Iのプログラムの骨格です。ここさえ押さえれば怖くありません。

/i
/ プログラムの入り口と名前を定義 /
SAMPLE_PROC: PACKAGE;

/ メイン処理の開始 /
MAIN_PROC: PROCEDURE OPTIONS(MAIN);

/ ここにONユニット(監視員)を配置します /
ON ZERODIVIDE BEGIN;
PUT SKIP LIST(‘警告: ゼロ除算が発生しました。計算をスキップします。’);
/ ここで処理を継続するか、異常終了させるかを制御 /
END;

/ 本来の処理がここに続く /

END MAIN_PROC;

END SAMPLE_PROC;

ゼロ除算をキャッチする具体的なコード

実務では、「分母が0になる可能性があるデータ」がファイルから飛んでくることがよくあります。そんな時、プログラムを落とさずに「安全に逃げる」ための書き方を紹介します。

/i
DIV_TEST: PROCEDURE OPTIONS(MAIN);

DCL (A, B, RESULT) FIXED DEC(10, 2);

/ ゼロ除算が発生した時の「緊急回避ルート」を定義 /
ON ZERODIVIDE BEGIN;
PUT SKIP LIST(‘エラー検知: 除数がゼロです。0を代入して続行します。’);
RESULT = 0;
/ GOTOを使って、計算後の処理へ強制ジャンプさせるテクニック /
GOTO CALC_CONTINUE;
END;

A = 100;
B = 0; / ここでゼロ除算が発生! /

RESULT = A / B;

CALC_CONTINUE: / ジャンプ先 /
PUT SKIP LIST(‘計算結果: ‘, RESULT);
PUT SKIP LIST(‘プログラムは正常に終了しました。’);

END DIV_TEST;

このコードのポイント

1. DCL(宣言): `FIXED DEC` は、基幹システムでよく使われる「固定小数点数」です。金額計算などで誤差が出ないようにするための、メインフレームの定番データ型ですね。
2. ON ZERODIVIDE: この行を実行した瞬間から、このプログラム内でのゼロ除算はすべてこのブロックが監視します。
3. GOTOの活用: 「えっ、GOTOを使うの?」と驚くかもしれませんが、PL/IのONユニット内での`GOTO`は、エラー復帰の定石です。例外発生地点から強制的に正常フローへ復帰させるための「脱出ハッチ」のようなものですよ。

初学者の皆さんへ:PL/Iを恐れないで

PL/Iには、他の言語とは少し違う「独特の匂い」があります。特に `DCL` による変数の属性指定や、`PACKAGE` や `PROCEDURE` の入れ子構造は、最初は戸惑うかもしれません。

でも、安心してください。PL/Iは「実行時の柔軟性が非常に高い」言語です。今回紹介したONユニットも、プログラムを止めることなく、現場の業務要件に合わせて「エラーなら0にする」「エラーならログを出して次のレコードへ行く」といった制御を、非常にシンプルに書くことができます。

メインフレームの世界は、何十年も動き続ける「生き物」のようなシステムです。その堅牢性を支えているのは、こうした昔ながらの、しかし非常に強力な例外処理の知恵なんです。

次にゼロ除算に遭遇した時、皆さんはもう冷や汗をかく必要はありません。堂々と「ONユニット」を定義して、スマートにシステムを救ってあげてくださいね。

また次の講義でお会いしましょう!何か不明点があれば、いつでも現場のアーキテクトに聞いてください。

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