コンテンツフレーム起動

例外テキスト 文書を SAP ライブラリストラクチャに組み込む

 

キャッチされた例外の最も重要な特色は、例外が発生してプログラムで処理されたという事実です。例外状態をどう処理するかは、ハンドラに任されています。プログラムユーザとの対話は、例外そのものの責任ではありません。

にもかかわらず、各例外に説明テキストが割り当てられています。このテキストでは例外状況が正確に説明されており、例外が処理されない場合はエラーメッセージとして出力されます。ただし、このテキストは、ユーザとの通信用に例外処理時に控えめに使用する必要があります。例外テキストでは、主として技術的な視点からエラー状況が説明されます。ユーザに例外を説明する場合、ユーザの観点から説明する必要があります。

例外テキストのパラメータとしての属性

例外テキストには、エラー状況をより正確に説明するためのパラメータを含めることができます。ここでは、内容をテキストとして解釈できる例外クラスの基本属性が使用されます。例外テキストで文字 '&' を使って名前を照会することによって、属性を例外テキストのパラメータに変換することができます。文字 '&' が実際にテキストに表示される場合は、2 回入力する必要があります。

例外オブジェクトに属性 LAWYER および PARTNER があり、その内容が 'Smith' および 'Jones' の場合は、クラスのパラメータ化された例外テキストは以下のようになります。

Chambers &lawyer&&&&partner&

オブジェクトステータスは以下のようになります。

Chambers Smith&Jones

規則

属性を使用して例外テキストにパラメータを設定するための規則は、以下のとおりです。

...

       1.      クラスの属性でないテキストパラメータがメッセージに表示される場合、パラメータの名前は変更されずにテキストに残ります。

       2.      オブジェクトの属性ではあるがテキストとして解釈できないテキストパラメータがメッセージに表示される場合、パラメータの名前は変更されずにテキストに残り、属性タイプも指定されます。

       3.      代入される属性の内容が合理的な長さを超える場合は、切り詰めることができます ('...' で表示されます)

例外テキストの管理

グローバル例外クラスの例外テキストは、さまざまな翻訳とともに OTR (Open Text Repository) に保存されます。テキストは、CX_ROOT スーパークラスで定義された TEXTID 属性を使って例外クラスに割り当てられます。この属性には、実行時の例外オブジェクトにある OTR のテキストオブジェクトでグローバルに一意な ID が含まれます。GET_TEXT メソッドでこのテキストが読み込まれ、テキストパラメータに対応する属性の内容が代入され、テキストが文字列として返されます。

OTR にはあらゆる言語の例外テキストが入っています。ただし、GET_TEXT が呼び出されてすぐに、ログオン言語を設定する必要があります。このため、アプリケーション内で例外オブジェクトそのものを使用すること、すなわちGET_TEXT によって返される値を使用するよりも、例外を転送または保存することの方が適しています。

例外テキストの登録

グローバルクラスの例外テキストは、例外ビルダのテキストタブページで定義されます。例外ビルダでは、OTR に対応するエントリが生成されます。

個別 ID を持つ複数のテキストを1 つのクラスに割り当てることができます。例外ビルダでは各グローバルクラスに標準テキストが生成されます。この標準テキストの変更できない名前は、クラス名と同じです。追加テキストに個別名を割り当てる必要があります。各テキストに対して、例外ビルダは OTR に関連する ID を含む静的定数を生成します。このため、例外テキストの名前は例外クラスの属性と同じ名前空間にあり、継承階層の 1 つのパスに対して一意です。テキストは静的定数によってアドレスおよび識別することができるため、ABAP プログラムの OTR で直接使用する必要はありません。

例外ビルダにおける例外テキストの例

事前定義された例外クラス CX_SY_FILE_OPEN_MODE 、ファイルが開かれなかったか単に正しいモードで開かれなかったファイルアクセス時の例外を参照するために、実行時環境によって使用されます。標準テキストとは異なり、クラスにはREAD_ONLYNOT_OPEN 、およびINCOMPATIBLE_MODE と呼ばれる 3 つの追加テキストが含まれます。これにより、追加の従属クラスをただちに登録しなくても、例外をより明確に処理できるようになります。

例外テキストおよびコンストラクタ

上述の静的定数をインスタンスコンストラクタの IMPORTING パラメータ TEXTID に転送することによって例外が生成される際に、使用される例外テキストを決定することができます。このテキストを定義しない場合、標準テキストが使用されます。それに応じてインスタンスコンストラクタをプログラムする必要があります。グローバル例外クラスでは、各例外で少なくとも 1 つのテキストを使用できるように、例外ビルダでインスタンスコンストラクタが生成されます。標準テキストが入力されなかった場合でも、次に使用可能なスーパークラスのテキストが使用されます。

例外ビルダでは、インスタンスコンストラクタが、例外テキストのパラメータの入力に使用される属性と同じ名前のIMPORTING パラメータを持つことも保証されます。

ローカルクラスの場合は、これらの設定をユーザ自身が行う必要があります。

例外テキストの出力

例外テキストはエンドユーザとの対話を主たる目的として設計されているわけではありませんが、特定の場合においては、メッセージとして出力することもあります。このために、MESSAGE 命令は任意の文字列を出力できるように拡張されています。

MESSAGE string TYPE type.

メッセージ文字列を出力するとともに、必要な型も型項目で指定する必要があります。

例

report DEMO_EXCEPTION_TEXT.

data OREF type ref to CX_SY_FILE_OPEN_MODE.
data TEXT type STRING.

try.
     raise exception type CX_SY_FILE_OPEN_MODE
          exporting TEXTID = CX_SY_FILE_OPEN_MODE=>READ_ONLY
                    FILENAME = `DUMMY.DAT`.

   catch CX_SY_FILE_OPEN_MODE into OREF.
     TEXT = OREF->GET_TEXT( ).
     message TEXT type 'I'.
endtry.

try.
     raise exception type CX_SY_FILE_OPEN_MODE
          exporting TEXTID = CX_SY_FILE_OPEN_MODE=>NOT_OPEN
                    FILENAME = `DUMMY.DAT`.

   catch CX_SY_FILE_OPEN_MODE into OREF.
     TEXT = OREF->GET_TEXT( ).
     message TEXT type 'I'.
endtry.

try.
     raise exception type CX_SY_FILE_OPEN_MODE
    exporting TEXTID = CX_SY_FILE_OPEN_MODE=>INCOMPATIBLE_MODE
                    FILENAME = `DUMMY.DAT`.

   catch CX_SY_FILE_OPEN_MODE into OREF.
     TEXT = OREF->GET_TEXT( ).
     message TEXT type 'I'.
endtry.

この例では、事前定義された例外 CX_SY_FILE_OPEN_MODE が生成され 3 回キャッチされています。クラスの 3 つの例外テキストが交互に使用され、さまざまなパラメータのやり取りを使って、これらのFILENAME パラメータがインスタンスコンストラクタに提供されます。

 

 

 

コンテンツフレーム終了