SAPABAP-例外処理

アン exceptionプログラムの実行中に発生する問題です。例外が発生すると、プログラムの通常のフローが中断され、プログラムアプリケーションが異常終了します。これはお勧めできません。したがって、これらの例外を処理する必要があります。

例外は、プログラムのある部分から別の部分に制御を移す方法を提供します。ABAP例外処理は、RAISE、TRY、CATCH、およびCLEANUPの3つのキーワードに基づいて構築されています。ブロックが例外を発生させると仮定すると、メソッドはTRYキーワードとCATCHキーワードの組み合わせを使用して例外をキャッチします。TRY-CATCHブロックは、例外を生成する可能性のあるコードの周囲に配置されます。以下は、TRY – CATCH −を使用するための構文です。

TRY.      
Try Block <Code that raises an exception> 
  
CATCH  
Catch Block <exception handler M>  
. . . 
. . . 
. . . 
CATCH  
Catch Block <exception handler R>
   
CLEANUP. 
   Cleanup block <to restore consistent state>
 
ENDTRY.

RAISE−例外は、いくつかの例外的な状況が発生したことを示すために発生します。通常、例外ハンドラはエラーを修復するか、代替の解決策を見つけようとします。

TRY− TRYブロックには、例外が処理されるアプリケーションコーディングが含まれています。このステートメントブロックは順番に処理されます。さらに、制御構造とプロシージャまたは他のABAPプログラムの呼び出しを含めることができます。その後に1つ以上のキャッチブロックが続きます。

CATCH−プログラムは、問題を処理したいプログラム内の場所で例外ハンドラーを使用して例外をキャッチします。CATCHキーワードは、例外のキャッチを示します。

CLEANUP− CLEANUPブロックのステートメントは、同じTRY-ENDTRYコンストラクトのハンドラーによってキャッチされないTRYブロックで例外が発生するたびに実行されます。CLEANUP句内で、システムはオブジェクトを一貫性のある状態に復元したり、外部リソースを解放したりできます。つまり、TRYブロックのコンテキストに対してクリーンアップ作業を実行できます。

例外の発生

例外は、メソッド、汎用モジュール、サブルーチンなどの任意の時点で発生する可能性があります。例外を発生させる方法は2つあります-

  • ABAPランタイムシステムによって発生した例外。

    たとえば、Y = 1/0です。これにより、CX_SY_ZERODIVIDEタイプの実行時エラーが発生します。

  • プログラマーによって提起された例外。

    例外オブジェクトの発生と作成を同時に行います。最初のシナリオにすでに存在する例外オブジェクトを使用して例外を発生させます。構文は次のとおりです。RAISEEXCEPTIONexep。

例外をキャッチする

ハンドラーは、例外をキャッチするために使用されます。

コードスニペットを見てみましょう-

DATA: result TYPE P LENGTH 8 DECIMALS 2, 
exref TYPE REF TO CX_ROOT, 
msgtxt TYPE STRING. 
PARAMETERS: Num1 TYPE I, Num2 TYPE I. 
TRY. 
result = Num1 / Num2. 
CATCH CX_SY_ZERODIVIDE INTO exref. 
msgtxt = exref→GET_TEXT( ). 

CATCH CX_SY_CONVERSION_NO_NUMBER INTO exref. 
msgtxt = exref→GET_TEXT( ).

上記のコードスニペットでは、Num1をNum2で除算して、float型変数の結果を取得しようとしています。

2種類の例外が生成される可能性があります。

  • 数値変換エラー。

  • ゼロ除算例外。ハンドラーは、CX_SY_CONVERSION_NO_NUMBER例外とCX_SY_ZERODIVIDE例外をキャッチします。ここでは、例外クラスのGET_TEXT()メソッドを使用して、例外の説明を取得します。

例外の属性

例外の5つの属性とメソッドは次のとおりです-

S.No. 属性と説明
1

Textid

例外のさまざまなテキストを定義するために使用され、メソッドget_textの結果にも影響します。

2

Previous

この属性は、例外のチェーンを構築できるようにする元の例外を格納できます。

3

get_text

これにより、例外のシステム言語に従って、テキスト表現が文字列として返されます。

4

get_longtext

これにより、例外のテキスト表現の長いバリアントが文字列として返されます。

5

get_source_position

例外が発生した場所に到達したプログラム名と行番号を示します。

REPORT ZExceptionsDemo. 
PARAMETERS Num_1 TYPE I. 

DATA res_1 TYPE P DECIMALS 2. 
DATA orf_1 TYPE REF TO CX_ROOT. 
DATA txt_1 TYPE STRING. 

start-of-selection. 
Write: / 'Square Root and Division with:', Num_1. 
write: /. 

TRY. 
IF ABS( Num_1 ) > 150. 
RAISE EXCEPTION TYPE CX_DEMO_ABS_TOO_LARGE. 
ENDIF.
  
TRY. 
res_1 = SQRT( Num_1 ). 
Write: / 'Result of square root:', res_1. 
res_1 = 1 / Num_1. 

Write: / 'Result of division:', res_1. 
CATCH CX_SY_ZERODIVIDE INTO orf_1. 
txt_1 = orf_1→GET_TEXT( ). 
CLEANUP. 
CLEAR res_1. 
ENDTRY. 

CATCH CX_SY_ARITHMETIC_ERROR INTO orf_1. 
txt_1 = orf_1→GET_TEXT( ).

CATCH CX_ROOT INTO orf_1. 
txt_1 = orf_1→GET_TEXT( ). 
ENDTRY. 
IF NOT txt_1 IS INITIAL. 
Write / txt_1. 
ENDIF. 
Write: / 'Final Result is:', res_1.

この例では、数値が150より大きい場合、例外CX_DEMO_ABS_TOO_LARGEが発生します。上記のコードは、数値160に対して次の出力を生成します。

Square Root and Division with: 160 
The absolute value of number is too high 
Final Result is:  0.00