!--a11y-->

クラスベースの例外を生成させるために 2 つのオプションがあります。
1. 実行時環境でのシステムによる生成
2. ABAP プログラムでのプログラムによる生成
ABAP 実行時環境で ABAP 命令の実行中にエラー状況が発生すると、エラーに応じて、処理可能な例外または処理不能な例外が生成されます。処理可能な例外はクラスベースで、TRY と ENDTRY の間で処理されます。関連する例外クラスが事前定義され、CX_SY_ZERODIVIDE のようにプレフィクス CX_SY_ で始まります。ABAP キーワード文書では、対応する ABAP 命令の実行時に発生する例外の例外クラスが、キーワードごとに一覧表示されています。典型的な例として、上記のクラスCX_SY_ZERODIVIDE が挙げられます。これは COMPUTE 命令で算術演算が計算される際に生成されます。エラーの原因に応じて、事前定義された例外クラスごとに 1 つまたは複数の実行時エラーが割り当てられます。実行時エラーは、例外がキャッチされない場合にのみ発生します。
ABAP プログラムのエラー状況では、例外は RAISE EXCEPTION 命令を使用してプログラムによって生成されます。ここでは、ユーザ定義された例外クラスおよび事前定義された例外クラスの両方にもとづく例外を使用することができます。
RAISE EXCEPTION 命令には 2 つのバリアントがあります。
構文は以下のとおりです。
RAISE EXCEPTION TYPE cx_...[EXPORTING ... fi = ai ...].
この命令では、例外クラス cx_... にリンクする例外および対応する例外オブジェクトが生成されます。例外クラスのインスタンスコンストラクタのオプションのIMPORTING パラメータには、EXPORTING オプションを用意することができます。これにより、オブジェクトの属性にハンドラがアクセス可能な値を入力することができます。
効率上の理由により、例外オブジェクトが実際に生成されるのは、CATCH 命令の INTO オプションが例外の処理に使用される場合だけです。この理由により、属性の初期化のための機能を除き、コンストラクタには追加の機能を入れるべきではありません。また、グローバル例外クラスでは変更できません ( ローカル例外クラスのコンストラクタにのみ追加機能を入れることができます) 。
構文は以下のとおりです。
RAISE EXCEPTION ref.
このケースでは、例外オブジェクトはすでに存在し、REF 参照変数がこのオブジェクトをポイントしている必要があります。これは、例外が 1 度すでにキャッチされていて、しかしハンドラで再度生成したい場合 ( 完全に処理されていないためなど) 、または例外オブジェクトが以前に CREATE OBJECT によって生成された場合などです。

report DEMO_RAISE_EXCEPTIONS.
data OREF type ref to CX_ROOT.
data TEXT type STRING.
try.
try.
raise
exception type CX_DEMO_CONSTRUCTOR
exporting MY_TEXT
= SY-REPID.
catch
CX_DEMO_CONSTRUCTOR into OREF.
TEXT =
OREF->GET_TEXT( ).
write /
TEXT.
raise
exception OREF.
endtry.
catch
CX_DEMO_CONSTRUCTOR into OREF.
TEXT =
OREF->GET_TEXT( ).
write /
TEXT.
endtry.
この例では、RAISE EXCEPTION 命令の 2 つのバリアントが示されています。最初の命令では、内部 TRY ブロックのクラス CX_DEMO_CONSTRUCTOR のユーザ定義例外が削除され、対応するオブジェクトが生成され、プログラム名がインスタンスコンストラクタに転送されます。内部 CATCH ブロックでは、例外が処理され、例外テキストが出力され、例外が新規オブジェクトを生成せずに再度生成されます。外部 CATCH ブロックは例外を再度処理します。クラス CX_DEMO_CONSTRUCTOR は、転送されたプログラム名が例外テキストに表示されるように定義されます。生成されたインスタンスコンストラクタはこれを考慮します。