Sap-abap-exception-handling

提供:Dev Guides
移動先:案内検索

SAP ABAP-例外処理

  • 例外*は、プログラムの実行中に発生する問題です。 例外が発生すると、プログラムの通常のフローが中断され、プログラムアプリケーションが異常終了します。これは推奨されません。したがって、これらの例外は処理されます。

例外は、プログラムのある部分から別の部分に制御を移す方法を提供します。 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* -プログラムは、プログラム内の問題を処理する場所で例外ハンドラーを使用して例外をキャッチします。 CATCHキーワードは、例外のキャッチを示します。
*CLEANUP* -CLEANUPブロックのステートメントは、同じTRY-ENDTRYコンストラクトのハンドラーによってキャッチされないTRYブロックで例外が発生するたびに実行されます。 CLEANUP句内で、システムはオブジェクトを一貫した状態に復元したり、外部リソースを解放したりできます。 つまり、TRYブロックのコンテキストに対してクリーンアップ作業を実行できます。

例外を発生させる

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

  • ABAPランタイムシステムによって発生した例外。 +たとえば、Y = 1/0。 これにより、タイプCX_SY_ZERODIVIDEの実行時エラーが発生します。
  • プログラマーによって発生した例外。 +例外オブジェクトを同時に発生させて作成します。 最初のシナリオに既に存在する例外オブジェクトを使用して、例外を発生させます。 構文は次のとおりです。RAISEEXCEPTION exep。

例外をキャッチする

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

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

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. Attribute & Description
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