05.3プログラム割込みのトラップ(SPIE,ESPIE)

By 神居 - Posted: 2009/04/06 Last updated: 2009/12/18 - Leave a Comment

業務用アプリケーションでは、誤ったデータによる演算の結果、プログラムが異常終了することがしばしば起こります。プログラムロジックには問題がないのにデータが原因でプログラム割り込みが引き起こされるためです。このようなことを防止するため、入力されたデータや、データセットから読み込んだデータの妥当性をチェックすることは、よく行われるプログラミング手法です。他の方法として、結果として誤りであったら、その誤りをなかったことにする方法もあります。読み込んだデータが悪いため、演算命令がエラーになったら、プログラムをそこで終了するのではなく、そのデータを捨てて、次のデータを処理できるようにできます。例外処理とも呼ばれ、コンパイラー言語などではON ERROR、TRY?CATCHなどの記述で行われます。MVSではSPIE,ESPIE APIによって例外処理を設定することができます。
SPIEはプログラム割り込みが発生した時、プログラムをABENDさせずに、予め指定されたルーチン(SPIE出口ルーチン)を実行してエラーが発生したことをプログラムに通知します。


0による除算をトラップしてメッセージを出力する

このようにSPIEを使うと、指定したプログラム割り込みであれば、発生してもABENDせずに、指定のSPIE出口ルーチンが実行されることでプログラムに通知されます。トラップルーチンにはPIEと言うパラメータ・リストが渡され、それを見ることでABENDの内容、発生したアドレスを知ることができます。このサンプルのようにPIE内容を変更しなければ、ABENDした次の命令からメインラインの実行を再開させることができます。


指定可能なすべてのプログラム割り込みをトラップして、独自のABENDメッセージを出す。
データ例外であれば、その入力データを捨てる。

サンプルなので無理して全部のプログラム割り込みをトラップしていますが、実際には必要なものだけに絞って行う方がよいでしょう。一般のアプリケーションであれば、0C7や0C9で十分かと思います。

ABENDしたアドレスや割り込みコードは出口ルーチンに渡される、PIE(Program Interruption Element)を参照すれば知ることができます。PIE内のPSWアドレスフィールドを書き換えれば、任意の場所からプログラムを再開させることができます。この例ではS0C7ABENDの場合にそれを行っています。
なおSPIEは24ビットモードのプログラムでなければ使用できません。31ビットモード・プログラムの場合は次に示す、ESPIEを利用します。


31ビットモード・プログラムにおけるSPIE(ESPIE)

2番目のサンプルと同じものを、31ビットモード・プログラム用のESPIEで置き換えた例です。
ESPIEでは出口ルーチンに渡されるPIEはESPIE(Extend PIE)に変わり、そのフォーマットは異なります。そのためSPIEを使っている24ビットモード・プログラムを31ビットモードに書き換える場合、単にマクロをSPIEからESPIEに交換するだけでは済みません。対応するフィールドのオフセットをESPIE用に変更しなければなりません。3番目のサンプルでは直接オフセット値を指定せずに、EPIEのマッピングマクロを使用してフィールドを名前で参照するようにしました。
MVSはPIE用にIHAPIE、EPIE用にIHAEPIEマクロを提供しています。MSPではそれぞれKAAPIEとKAAEPIE、VOS3ではMVSと同じIHAPIEが利用できます。なおVOS3では31ビットモード・プログラム用のSPIE機能は存在しますが公開されていないため、ここでは紹介しません。

大量の入力データを処理するようなプログラムでは、その中にいくつかの誤りデータが入っていても、途中で処理をやめずにエラーデータだけをはずして、正常なデータについてはすべて処理しきってしまいたい、という仕様もあります。処理前にチェックしてはじくか、エラーになったものをはじくか、いずれの方法もありますが、後者であればSPIE/ESPIEを利用すれば、プログラムチェック割り込みによるABENDは回避できます。どちらの場合であってもどのデータをはずしたか、きちんとログを取って、完了コードも0ではなく4にするなど、運用面でも誤りに気づきやすい設計にすることが大切です。

Posted in 中級編 • • Top Of Page