!--a11y-->

例外は、例外クラスのインスタンスであるオブジェクトによって表示されます。このため、例外の定義は、例外クラスの登録と同じです。
すべての例外クラスは、共通スーパークラス CX_ROOT およびその従属クラスのうちの1 つから継承する必要があります。
キ CX_STATIC_CHECK
キ CX_DYNAMIC_CHECK
キ CX_NO_CHECK
. 例外クラスから継承階層のこれらの3 つのパスのいずれかへの割当によって、関連する例外が伝播される方法が決定されます。例外が実行時環境のエラー状況で生成される、事前定義された例外クラスCX_SY_... の記録があります。これらのクラスはすべてCX_DYNAMIC_CHECK または CX_NO_CHECK から継承されますが、CX_STATIC_CHECK からは継承されません (ABAP キーワード文書の階層を参照) 。
すべての例外クラスはプレフィクス CX_ で始まる必要があります。これらは一般に ABAP ワークベンチのクラスビルダでグローバルに定義されます。ただし、ローカル例外クラスも定義することができます。
追加の例外クラスのスーパークラスとして使用される個別 ( 抽象) 例外クラスも定義することができます。従属クラスの例外は、スーパークラスを使って一緒に処理することができます。
例外クラスには、以下のような機能があります。
キ
コンストラクタ
コンストラクタには事前定義構造および特定のインタフェースが必要です。グローバルクラスを使用して、クラスビルダは正しいコンストラクタを生成し、不変のステータスを設定します。コンストラクタには、2
つの IMPORTING
パラメータがあります。
SOTR_CONC 型の TEXTID
このパラメータを使用して、例外で使用される例外テキストを特定します。
CX_ROOT 型の PREVIOUS
このパラメータを使用して、以前の例外に PREVIOUS 属性を割り当てます。
キ
メソッド
例外クラスでは、独自のメソッドを定義することができます。以下の 2
つの事前定義メソッドは、ルートクラス CX_ROOT
から継承されます。
GET_TEXT
クラス (TEXTID 属性によって制御された) の例外テキストを文字列として返します。
GET_SOURCE_POSITION
プログラム名、潜在的なインクルードプログラムの名前、および例外を生成した命令の行番号を返します。
キ
属性
例外クラスの属性を使用して、エラー状況の追加情報をハンドラに転送します。ただし、情報の主な内容は常に、特定のクラスの例外が発生したという事実です。以下の属性が CX_ROOT
から継承されます。
TEXTID
この属性を使用して、複数の例外テキストを使ってより正確にクラスの属性を指定します。GET_TEXT メソッドで評価されます。
PREVIOUS
例外が他の例外にマップされる場合、この属性で元の例外への参照を定義することができます。RAISE EXCEPTION 命令の EXPORTING オプションを使用して、およびコンストラクタ IMPORTING PARAMETER を使用して同じ名前で定義します。これにより、例外オブジェクトのチェーンが作成されます。実行時エラーのイベントでは、チェーンのすべての例外の例外テキストが出力されます。例外の他の例外へのマッピングは、元の例外が発生したコンテキストがエラー状況の特徴づけにとって重要な場合にのみ、有益です。
KERNEL_ERRID
例外が実行時環境で生成された場合、関連する実行時エラーの名前はこの属性に格納されます。たとえば、ゼロ除算のCOMPUTE_INT_ZERODIVIDE などです。例外が処理されない場合、この実行時エラーが発生します。
パラメータはこの属性のコンストラクタには転送できません。例外が RAISE EXCEPTION で生成された場合は、属性は初期値に設定されます。
グローバル例外クラスは、クラスビルダで定義および管理されます。新規クラスの登録時に、正しい命名規則 ( プレフィクス CX_) およびクラスタイプ例外クラスが選択されると、クラスビルダは自動的に例外ビルダになります。
例外ビルダでは、例外クラスの定義に必要な機能が提供され、変更してはならない個別定義コンポーネントが生成されます。クラスを登録する際、例外のカテゴリ、すなわちCX_STATIC_CHECK 、CX_DYNAMIC_CHECK 、または CX_NOCHECK のいずれから継承されるか、を指定する必要があります。
例外ビルダにはタブページプロパティ、属性、メソッドおよびテキストがあります。
キ プロパティは通常変更する必要はありません。
キ 上述の 4 つの継承属性を除いて、例外ビルダで追加のパブリック属性を生成することができます。これらの属性の内容によって、例外はより明確に指定され、例外テキストが管理されます。
キ
すべての属性は CX_ROOT
から継承されます。新規メソッドを追加することはできません。インスタンスコンストラクタは自動生成されます。これにより、例外が生成される際、属性に正しい値が設定されるようになります。例外テキストが明示的に指定されていない例外クラスに対してスーパークラスのテキストも転送されます。
インスタンスコンストラクタは属性にもとづいて生成され、例外テキストにもとづいて設定されます。このため、スーパークラスで属性を変更すると、従属クラスのコンストラクタが無効になる可能性があります。従属クラスのコンストラクタは、
ユーティリティ →
クリーンアップ →
コンストラクタ
と選択して再生成することができます。
キ テキストは、例外クラスおよび例外ビルダの特別な機能です。追加情報については、例外テキストを参照してください。
単一の ABAP プログラム内でのみ発生する特定の例外のために、ローカル例外クラスを定義することができます。ローカル例外クラスの条件は、3 つのクラス CX_STATIC_CHECK 、CX_DYNAMIC_CHECK 、または CX_NO_CHECK のいずれかまたはその従属クラスから継承することです。個別コンストラクタおよび個別属性を登録することができます。個別メソッドは登録できず、スーパークラスのメソッドは再定義できません。

report DEMO_LOCAL_EXCEPTION_1.
class CX_LOCAL_EXCEPTION definition
inheriting
from CX_STATIC_CHECK.
endclass.
start-of-selection.
try.
raise
exception type CX_LOCAL_EXCEPTION.
catch
CX_LOCAL_EXCEPTION.
message
'Local Exception!' type 'I'.
endtry.
この例は、最小限の例外クラスを示しています。これは CX_ROOT の 3 つの直接従属クラスのうちの 1 つのローカル表示です。これはプログラムで使用することができます。

report DEMO_LOCAL_EXCEPTION_2.
class CX_LOCAL_EXCEPTION definition
inheriting
from CX_STATIC_CHECK.
public
section.
data
LOCAL_TEXT type STRING.
methods
CONSTRUCTOR importing TEXT type STRING.
endclass.
class CX_LOCAL_EXCEPTION
implementation.
method
CONSTRUCTOR.
SUPER->CONSTRUCTOR(
).
LOCAL_TEXT =
TEXT.
endmethod.
endclass.
data OREF type ref to CX_LOCAL_EXCEPTION.
start-of-selection.
try.
raise
exception type CX_LOCAL_EXCEPTION
exporting
TEXT = `Local Exception`.
catch
CX_LOCAL_EXCEPTION into OREF.
message
OREF->LOCAL_TEXT type 'I'.
endtry.
この例では、以前の例からの例外クラスが、個別属性および個別コンストラクタをインクルードするように拡張されています。例外発生時には、コンストラクタのIMPORTING パラメータを指定する必要があります ( ここで必要とされる場合は) 。属性は、例外のハンドラで評価することができます。

report DEMO_LOCAL_EXCEPTION_3.
class CX_LOCAL_EXCEPTION definition
inheriting from
CX_SY_ARITHMETIC_ERROR.
public
section.
methods
CONSTRUCTOR importing SITUATION type STRING.
endclass.
class CX_LOCAL_EXCEPTION
implementation.
method
CONSTRUCTOR.
SUPER->CONSTRUCTOR(
OPERATION = SITUATION ).
endmethod.
endclass.
data OREF type ref to CX_LOCAL_EXCEPTION.
data TEXT type STRING.
start-of-selection.
try.
raise
exception type CX_LOCAL_EXCEPTION
exporting
SITUATION = `START-OF-SELECTION`.
catch
CX_LOCAL_EXCEPTION into OREF.
TEXT =
OREF->GET_TEXT( ).
message TEXT
type 'I'.
endtry.
この例では、例外クラスは、実行時環境におけるエラー状態の事前定義された例外クラスのうちの 1 つのから誘導されています。個別コンストラクタは、スーパークラスコンストラクタにこのパラメータを提供する個別のIMPORTING パラメータで定義されます。例外が処理されると、スーパークラスで定義された例外テキストはGET_TEXT で読み込まれます。