05.1プログラムをABENDさせる(ABEND)

By 神居 - Posted: 2008/11/20 Last updated: 2009/12/09 - Leave a Comment

実行中にデータやパラメーターの誤りを見つけた時、自ら論理の矛盾やデータの不整合がわかった時、プログラム自ら途中で処理を止めて実行を中止することがあります。原因や理由が明確ならばメッセージやログデータによってそれを指摘した上で完了コードを設定して終了することもできます。しかしエラーが起きたことはわかったが、原因や理由はわからない場合、プログラムは自分自身を異常終了させるようOSに要求することができます。アベンドすべきかノーマルエンドすべきかの基準はありませんので、デザイナーが自由に決められます。わからなければ他のソフトウェアがどうしているかなどを参考にするのもいいでしょう。


プログラムをABENDさせる?

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コードは使わない方がいいでしょう。



プログラムをABENDさせる?

ABENDマクロを使わないで、プログラム割込みによる方法です。
システムプログラムではしばしばわざと誤った命令を実行してABENDさせる方法が採られます。最初の例は奇数レジスターを指定した除算です。DR R1,R1と書くのと同じですが、アセンブラーが構文チェックをするのでDC命令で命令コードを直接書き込みます。2番目の例はEX命令で自分自身を指します。どちらも意図的に行わない限り起き得ないABENDなので、「何かエラーを見つけてわざとそこでABENDさせたんだな」と言うことを伝えられます。
昔こう言った手法をがあることを知らない頃は「これ書いた奴ってバカじゃないの?」なんて思ったことがありますが、バカなのは私でした。

なお故意によるプログラム割込みでABENDさせる時は、S0C1やS0C4あるいはS0C7,S0C9と言った、本当のバグや誤ったデータによって起きるABENDと混同してしまうコードを使うのは避けましょう。

Posted in .基礎編 • • Top Of Page