05.1プログラムをABENDさせる(ABEND)
実行中にデータやパラメーターの誤りを見つけた時、自ら論理の矛盾やデータの不整合がわかった時、プログラム自ら途中で処理を止めて実行を中止することがあります。原因や理由が明確ならばメッセージやログデータによってそれを指摘した上で完了コードを設定して終了することもできます。しかしエラーが起きたことはわかったが、原因や理由はわからない場合、プログラムは自分自身を異常終了させるようOSに要求することができます。アベンドすべきかノーマルエンドすべきかの基準はありませんので、デザイナーが自由に決められます。わからなければ他のソフトウェアがどうしているかなどを参考にするのもいいでしょう。
プログラムをABENDさせる?
----+----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-- 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----+----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させたんだな」と言うことを伝えられます。
昔こう言った手法をがあることを知らない頃は「これ書いた奴ってバカじゃないの?」なんて思ったことがありますが、バカなのは私でした。
なお故意によるプログラム割込みでABENDさせる時は、S0C1やS0C4あるいはS0C7,S0C9と言った、本当のバグや誤ったデータによって起きるABENDと混同してしまうコードを使うのは避けましょう。