メインフレームの現場で生き残るための「例外処理」の作法:ON ZERODIVIDE編
やあ、後輩諸君。今日もJCLのジョブカードと格闘しているか?
メインフレームの世界では、「動いて当たり前」のバッチが何十年と稼働し続けている。だが、一度データが壊れたり、予測不能な計算値が流れてきたりすれば、システムは容赦なくU4038やS0CBで沈没する。特にゼロ除算(ZERODIVIDE)は、夜間バッチを止める一番の手間のかかる「悪癖」だ。
今日は、PL/Iにおける例外処理の基本であり、かつ実務で最も差が出る`ON ZERODIVIDE`の扱いについて、現場の知見を叩き込んでおこうと思う。
—
1. なぜ「ONユニット」でなければならないのか
「IF文で除数がゼロか判定すればいいじゃないか」と考えるのは正論だ。しかし、複雑な演算ロジックが絡み合う基幹バッチにおいて、すべての除算箇所に判定を入れるのは、コードの可読性を下げ、メンテナンス漏れを生む元になる。
PL/Iの`ONユニット`は、いわば「計算上の安全網」だ。例外が発生した瞬間に制御を奪い取り、プログラムを異常終了させることなく、リカバリ(デフォルト値の設定やログ出力など)へと誘導できる。これがメインフレームの堅牢性を支える一丁目一番地だ。
—
2. 実践的なコーディング例:異常終了を回避する構造
以下に、実務でよく遭遇するVSAMファイルからのデータ読み込みを想定した、標準的な実装パターンを示す。
1
TEST_CALC: PROC OPTIONS(MAIN);
/ — 宣言部 — /
DCL DATA_IN FIXED BIN(15);
DCL DIVISOR FIXED BIN(15);
DCL RESULT FIXED DEC(15,2);
DCL (EOF) BIT(1) INIT(‘0’B);
/ — ONユニットの定義 — /
/ ゼロ除算発生時のリカバリ処理 /
ON ZERODIVIDE
BEGIN;
PUT SKIP LIST(‘警告: ゼロ除算を検知しました。結果を0として継続します。’);
RESULT = 0; / 異常終了させずに0で代用して継続させる /
GOTO RESUME_LABEL;
END;
/ — メイン処理ループ — /
DO WHILE(EOF = ‘0’B);
/ ここでは仮にファイル入力を想定 /
GET LIST(DATA_IN, DIVISOR);
/ ゼロ除算が起きうる演算 /
RESULT = DATA_IN / DIVISOR;
RESUME_LABEL:
PUT SKIP LIST(‘計算結果:’, RESULT);
END;
END TEST_CALC;
コードのポイント
- `BEGIN; END;`ブロックの活用: 単一行のONユニットも書けるが、実務ではログ出力やフラグ立てなど複数の処理が必要になるため、必ずブロックで括る癖をつけろ。
- `GOTO`の功罪: ONユニット内から元の処理に戻る際は、ラベルへの`GOTO`が最も確実だ。プログラムの制御フローが飛ぶことを嫌うモダン言語の思想もあるが、PL/Iの例外処理においては、この「復帰地点の明示」がバグを減らす。
—
3. 実務でハマる「落とし穴」とデバッグの極意
ベテランの私から、現場でよく見る「泣きを見ないための注意点」を伝授しておく。
① スコープの意識
ONユニットは、宣言されたブロック内であれば、その配下で呼び出されたサブプロシージャ(CALL先)で発生した例外も捕捉する。つまり、メインルーチンで一度定義しておけば、プログラム全体を保護できる場合が多い。しかし、逆に「意図しない場所での例外まで拾ってしまう」リスクもある。「必要な場所で定義し、終わったらREVERTで戻す」のが、洗練されたプログラマの作法だ。
② VSAMアクセスとの兼ね合い
VSAMファイルからの読み込み中に、フィールドが不正な数値(16進数でゴミが入っているなど)で除算しようとして落ちるケースは多い。この場合、`ON ZERODIVIDE`だけでなく、`ON CONVERSION`(データ変換エラー)とセットで対策を検討する必要がある。データが腐っている可能性があるなら、例外処理だけでなく、読み込み時のバリデーション(`CHECK`や`IF`での型チェック)を強化するのが先決だ。
③ デバッグ時のトレース
`ON`ユニットで無理やり継続させると、原因が分からず「結果がおかしい」というバグを生むことがある。本番環境では必ず`PUT DATA`等で、どの入力値が原因で例外が発生したかをSYSPRINTに残すようにせよ。あとでログを見た運用担当者が泣かないための、最低限の配慮だ。
—
最後に:堅牢なコードは「優しさ」から生まれる
メインフレームのバッチは、夜中に一人で走り続ける。開発者の君たちが書いたコードは、君たちが帰宅した後、誰もいないデータセンターで黙々と数百万件のレコードを処理するんだ。
`ON ZERODIVIDE`は、単なるエラー逃げではない。計算が弾けても、最後まで責務を全うするための「プログラムの矜持」だ。
次の改修案件では、ぜひこの作法を取り入れ、翌朝のオペレータが青ざめるような事態を一つでも減らしてくれ。それが、プロのシステムエンジニアというものだ。
何か詰まったら、またいつでも聞きに来い。現場からは以上だ。
