例外について

Javaの例外は、2つのカテゴリに分けられます。java.lang.RuntimeExceptionを拡張するもの(暗黙的例外)とそうでないもの(明示的例外)です。暗黙的例外を使用するJavaのプログラムは、より簡単です。例外の宣言や捕捉の必要がありません。RuntimeException(またはRuntimeExceptionのサブクラス)をスローするメソッドを記述する場合、メソッド・シグネチャ内にメソッドを宣言する必要はありません(宣言することもできます)。

明示的例外の使用方法

メソッドがエラーを示す際に明示例外を使用する場合、Javaプログラムには次のものが必要です。

次のコードでは、ValidationExceptionを宣言し、スローするメソッドgetCustNameを示しています。

public String getCustName(Customer cust) throws ValidationException {
  String name = cust.mName;
  if (name == null) {
    throw new ValidationException();
  }
  return name;
}

例外をスローするメソッドをコールするコードを記述する場合、そのコールをtry...catchブロックで囲みます。たとえば、次のコードでは、ValidationExceptionをスローするよう定義されたメソッドgetCustNameがコールされます。tryは、例外をスローする1つ以上のメソッドをコールしようとすることを表します。catchは、例外がスローされた場合にのみ実行されるコード・ブロックの先頭を示します。

public printName(Customer cust) {
  try {
    // Call the method(s) here.
    getCustName(cust);
  catch (ValidationException dae) {
    // Handle the error here.
    System.out.println(dae.getMessage());
  }
}

例外クラスについて

Oracle ADF Business Componentsフレームワークには、多くの例外クラス(たとえば、ValidationExceptionNameClashExceptionなど)が用意されています。これらのクラスがoracle.jbo.JboExceptionを拡張し、これがjava.lang.RuntimeExceptionを拡張します。このため、ビジネス・コンポーネント・メソッドでは、シグネチャにthrows句を記述せずにOracle ADF Business Componentsの例外をスローできます。

Oracle ADF Business Componentsの例外は、エラー・メッセージを格納する属性を持ち、NLS変換およびメッセージの書式設定をサポートしています。JboExceptionは、java.util.ListResourceBundleを使用してメッセージに書式を設定します。リソース・バンドル・クラスは、エラー・メッセージとして使用する定数および文字列を定義します。デフォルトの形式は、次のとおりです。

{productCode}-{errorCode}: {messageBody}    

次に例を示します。

ORA-10234: You cannot do that.    

ビジネス・コンポーネントの例外メッセージは、次の一般的なパラメータ・セットから導出されます。表に、各パラメータとその例を示します。

パラメータ

製品コード

"OBCJ"

エラー・コード

"03101"

リソース・バンドル

"oracle.jbo.CSMessageBundle"

オプションのパラメータ・セット

Vendor、Oracle

詳細

ビジネス・コンポーネントの例外に変換される、下位レベルのコードでスローされる例外

メッセージに、例外の発生時にのみ認識される情報の組み込みが必要な場合があります。このため、エラー・メッセージ文字列に、例外の発生時に例外に渡されるオブジェクトの配列内の値を参照するプレースホルダを含めることができます。メッセージに表示用の書式を設定する際、これらのパラメータは、java.text.MessageFormatにより提供された標準の書式設定機能によって、メッセージ内のスロット(最初のスロットは0)に挿入されます。次に、CSMessageBundle.javaからのエントリを示します。

public static final String EXC_VAL_ATTR_SET_FAILED = "03101";
...
// Description: Generic Attribute validation failure.
// set<Attribute> method failed to set the value.
// Parameter 0: Ignored.
// Parameter 1: Entity Object/View Object name.
// Parameter 2: Attribute name.
// Parameter 3: New value
{EXC_VAL_ATTR_SET_FAILED, "Attribute set with value {3} for {2} in {1} failed."},

JboExceptionクラスには、例外を扱うための次のメソッドが用意されています。

メソッド 説明
JboException(String message,
String errorCode,
Object[] params)

書式設定可能な例外オブジェクトを作成します。

JboException(Class resBundleClass,
String errorCode,
Object[] params)

変換可能な例外オブジェクトを作成します。

String getProductCode()

メッセージの製品コードを返します。

String getErrorCode()

エラー・コードを返します。

String getLocalizedMessage(Locale loc)

特定のロケールでのメッセージを返します。

Object[] getDetails()

詳細は、通常、下位レベルの例外を格納するために使用されます。たとえば、SQLExceptionが下位レベルのコード内でスローされると、Oracle ADF Business Componentsフレームワークではそれを処理し、ビジネス・コンポーネントの例外として表示できます。元のSQLExceptionが詳細内の最初のエントリになります。





String getResourceName()

メッセージの解決に使用されるリソース・バンドルの名前を返します。

Object[] getErrorParameters()

パラメータをエラーに返します。

JboExceptionHandlerの使用方法

JboExceptionHandlerは、3層アプリケーション用のユーザー・インストール可能な例外ハンドラです。例外がピギーバック方式で送られると、標準Java言語のthrowはほとんど機能しません。これは、(特に)ピギーバック方式では、複数の例外が返されることがあるためです。このため、例外は発生せず、ピギーバックから例外がアンロードされるたびにJboExceptionHandlerインタフェースのメソッドがコールされます。

JboExceptionHandlerにより、次のように定義します。

void handleException(Exception ex, boolean lastEntryInPiggyback);    

ここで、exはピギーバックからアンロードされた例外であり、lastEntryInPiggybackは、例外がピギーバック上の最後のエントリであったかどうかを示すフラグです。(2層の実行ではピギーバックは存在しませんので注意してください。)

独自のハンドラをインストールしない場合、デフォルトのハンドラが使用されます。デフォルトのハンドラは、アプリケーション・モジュールにより実装されます。(インタフェース・レベルでは、ApplicationModuleJboExceptionHandlerを実装します。)jbo.client.remoteでは、lastEntryInPiggybackがfalseの場合、この実装は例外を無視します。lastEntryInPiggybackがtrueの場合、例外がスローされます。

独自のハンドラをインストールするには、アプリケーション・モジュール・インタフェース上の次のメソッドをコールします。

void setExceptionHandler(JboExceptionHandler hndlr);    

次に、JboExceptionHandlerインタフェースの独自の実装を渡します。


検証ロジックの実装