ASSERT命令、及びアサーションエラーの仕組みと使いどころを解説します。
ASSERT命令は、一言で言うとプログラム内で起きた想定外のエラー情報を "開発者" に知らせるための命令です。読者の中には「ASSERT 1 = 2.」のような奇妙なコードを見かけたことがある方もいらっしゃるかもしれません。
このページでは、ASSERT命令の仕組み(アサーションエラーとは?)と使いどころをサンプルコード付きで解説します。
ABAPerとして1つレベルアップしたい方は必見です。是非最後までご覧ください。
Assert Error(アサートエラー)とは?
あまり聞きなれない言葉かと思いますが、アサートエラーを分かりやすく言い換えると想定外のエラーとなります。もっとかみ砕けば「ありえないエラー」です。
以下のコードをご覧ください。
* テーブルカテゴリの取得 SELECT TABNAME "テーブル名 TABCLASS "テーブルカテゴリ INTO TABLE LT_DD02L FROM DD02L WHERE TABNAME = 'BKPF'.
上記のコードは指定したテーブルのテーブル名 / テーブルカテゴリを取得するだけの処理で、確実に処理が成功することが想定される処理です。この場合、絶対に "SY-SUBRC" の値は "0" 以外になることは想定されません。にもかかわらず、 "SY-SUBRC" の値が "0" 以外になってしまったら、それが「Assert Error(アサートエラー)」です。
この "想定外" はユーザにとっての想定外ではなく、あくまでも開発者にとっての "想定外" を指します。
ユーザの入力内容によって発生するエラーであれば、例外処理やMESSAGEの表示を行うのが適切です。それは、開発者にとって想定内であるためです。
一方で上記のように開発者にとっても想定外のエラー(ありえないエラー)の場合は、ASSERT命令を利用するのが適切です。
ASSERT命令
ASSERT (論理式).
* テーブルカテゴリの取得 SELECT TABNAME "テーブル名 TABCLASS "テーブルカテゴリ INTO TABLE LT_DD02L FROM DD02L WHERE TABNAME = 'BKPF'. * アサーション ASSERT SY-SUBRC = 0.
ASSERT命令は、指定した論理式が偽の場合にプログラムの実行時エラー(ASSERTION FAILED)を発生させます。(プログラムがダンプします。)
※オプションを付与することで実行時エラーを回避することは可能ですが、利用されるシーンがほとんどないため説明は省略します。
* テーブルカテゴリの取得 SELECT TABNAME "テーブル名 TABCLASS "テーブルカテゴリ INTO TABLE LT_DD02L FROM DD02L WHERE TABNAME = 'BKPF'. * アサーション ASSERT SY-SUBRC = 0. WRITE '取得成功'.
「SY-SUBRC = 0」の場合は後続処理が続行されます(画面に「取得成功」と表示される)が、「SY-SUBRC = 0」ではない場合には、プログラムがそこで終了しASSERTION FAILEDとなります。
ABAPで利用できる比較演算子は以下のページでご確認いただけます。
ASSERT命令(ASSERT 1 = 2 .)
ASSERT命令を利用したコードでたまに見かける例がこちら。
CASE GV_VALUE. WHEN GP_1000. PERFORM Dynrpo_SET_1000. "Dynpro1000呼び出し WHEN GP_2000. PERFORM Dynrpo_SET_1000. "Dynpro2000呼び出し WHEN GP_3000. PERFORM Dynrpo_SET_3000. "Dynpro3000呼び出し WHEN OTHERS. ASSERT 1 = 2. "想定外のエラー ENDCASE.
「ASSERT 1 = 2. 」のように論理式が必ず偽(FALSE)となるように記述する例です。
変数「GV_VALUE」は、1000 / 2000 / 3000 のいずれかの値しか持たない想定のコード。この場合、1000 / 2000 / 3000 以外の値となった場合、アサートエラーを発生させることができます。
条件分岐の定義する命令です。オペランドに指定した変数の値に応じて、異なる処理を実行する場合に利用できる命令です。
詳細は、以下の記事で解説しております。
SAP / ABAPを1から学習したい方は
SAP / ABAPを1から学習したい初心者の方向けに、できるだけ網羅的にABAPが理解できるよう以下ページに知識体系を整理しています。
特に初心者のうちは、どこから学べばよいか?どう勉強すれば良いか?すらわからない状態になりがち。
ある程度の知識を持ったうえで、はじめて実践的な理解へとつながります。
是非、一度ご覧になってみてください。