実行中にデータやパラメーターの誤りを見つけた時、自ら論理の矛盾やデータの不整合がわかった時など、プログラム自ら途中で処理を止めて実行を中止することがあります。原因や理由が明確ならば、メッセージやログ・データによってそれを指摘した上で完了コードを設定して終了することもできます。しかし、エラーが起きたことはわかったがその原因や理由がわからない場合、プログラムは自分自身を異常終了させるようOSに要求することができます。アベンドすべきかノーマル・エンドすべきかの基準はありませんので、デザイナーが自由に決められます。わからなければ、他のソフトウェアがどうしているかなどを参考にするのもいいでしょう。
プログラムをABENDさせる①
1 2 3 4 5 6 7 8 |
----+----1----+----2----+----3----+----4----+----5----+----6----+----7-- ABEND 1 ABEND WITH CODE U0001 LA R1,222 LOAD ABEND CODE(U0222) ABEND (1),DUMP ABEND WITH STORAGE DUMP LA R1,878 LOAD ABEND CODE(U0878) ABEND (1),,STEP ABEND OUR JOB STEP TASK |
ABENDマクロは、プログラムの異常終了を行います。ABENDマクロのパラメーターは、その殆どが定位置パラメーターです。1番目のパラメーターは、完了コード(ABENDコード)を指定します。2番目がダンプを出力するかどうか、3番目はサブタスクがABENDマクロを発行する時、自タスクだけがABENDするのかジョブ・ステップ全体をABENDさせるかの指定です。シングル・タスクのプログラムでは、どのみちステップは終了します。
最初の例は、完了コードU0001でABENDさせます。2番目の例は、完了コードをレジスターに入れて指定するもので、ABEND時にダンプの出力も行います。この場合、プログラムを実行するJCLにはSYSUDUMP、SYSABENDあるいはSYSMDUMP DDステートメントの定義が必要です。ABENDマクロによるダンプ要求では、ダンプの出力先データセットをあらかじめOPENしておく必要はありません。3番目の例は、ダンプは出力せずにジョブ・ステップを終了させます。ダンプを出力するならDUMP,STEPと指定します。
ABENDコードには0~4095が指定でき、Unnnnの形式で表示されます。Sxxx形式のコードを指定することもできますが、MVSのABENDコードと混同するので特別な理由が無い限りシステムABENDコードは使わない方がいいでしょう。
理由コードを追加する
1 2 3 4 5 6 7 |
----+----1----+----2----+----3----+----4----+----5----+----6----+----7-- ABEND 3800,REASON=12 ABEND U3800(REASON=12) LA R1,3800 LOAD ABEND CODE(U3800) LA RF,8 LOAD REASON CODE(8) ABEND (1),REASON=(15), ABEND WITH STORAGE DUMP + DUMP |
MVSのOSモジュールでもよく使われますが、同じABENDコードを理由コードでさらに細分化することもできます。その場合には、REASONパラメーターを追加します。REASONはキーワード・パラメーターなので任意の位置に記述できます。
プログラムをABENDさせる②
1 2 3 4 |
----+----1----+----2----+----3----+----4----+----5----+----6----+----7-- DC X'1D11' ABEND WITH CODE S0C6 EX 0,* ABEND WITH CODE S0C3 |
ABENDマクロを使わない、プログラム割込みによる方法です。プログラムによっては、しばしばわざと誤った命令を実行してABENDさせる方法も採られます。最初の例は、奇数レジスターを指定した除算です。DR R1,R1と書くのと同じですが、アセンブラーが構文チェックをするのでDC命令で命令コードを直接書き込みます。2番目の例は、EX命令で自分自身を指します。どちらも意図的に行わない限り起き得ないABENDなので、デバッグ中のプログラムなどでダンプを採取するために使えます。ABENDマクロと違ってGR0とGR1は壊れません。MVSのAPIがエラーになるような時、パラメーター内容や出力情報などをダンプで確認する際に利用できます。ソフトウェア製品でも、公式に組み込む仕様ではなくデバッグ的な要素を残しておく意図で使われたりします。
なお、故意によるプログラム割込みでABENDさせる時は、S0C1やS0C4あるいはS0C7やS0C9といった本当のバグや誤ったデータによって起きるABENDと混同してしまうコードを使うのは避けます。