Javaの例外は、2つのカテゴリに分けられます。java.lang.RuntimeException
を拡張するもの(暗黙的例外)とそうでないもの(明示的例外)です。暗黙的例外を使用するJavaのプログラムは、より簡単です。例外の宣言や捕捉の必要がありません。RuntimeException
(またはRuntimeException
のサブクラス)をスローするメソッドを記述する場合、メソッド・シグネチャ内にメソッドを宣言する必要はありません(宣言することもできます)。
メソッドがエラーを示す際に明示例外を使用する場合、Javaプログラムには次のものが必要です。
throws
句
throw
文
次のコードでは、ValidationException
を宣言し、スローするメソッドgetCustName
を示しています。
public String getCustName(Customer cust) throwsValidationException
{
String name = cust.mName;
if (name == null) {
throw newValidationException
();
}
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フレームワークには、多くの例外クラス(たとえば、ValidationException
やNameClashException
など)が用意されています。これらのクラスが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() |
詳細は、通常、下位レベルの例外を格納するために使用されます。たとえば、 |
String getResourceName() |
メッセージの解決に使用されるリソース・バンドルの名前を返します。 |
Object[] getErrorParameters() |
パラメータをエラーに返します。 |
JboExceptionHandler
は、3層アプリケーション用のユーザー・インストール可能な例外ハンドラです。例外がピギーバック方式で送られると、標準Java言語のthrowはほとんど機能しません。これは、(特に)ピギーバック方式では、複数の例外が返されることがあるためです。このため、例外は発生せず、ピギーバックから例外がアンロードされるたびにJboExceptionHandler
インタフェースのメソッドがコールされます。
JboExceptionHandler
により、次のように定義します。
void handleException(Exception ex, boolean lastEntryInPiggyback);
ここで、ex
はピギーバックからアンロードされた例外であり、lastEntryInPiggyback
は、例外がピギーバック上の最後のエントリであったかどうかを示すフラグです。(2層の実行ではピギーバックは存在しませんので注意してください。)
独自のハンドラをインストールしない場合、デフォルトのハンドラが使用されます。デフォルトのハンドラは、アプリケーション・モジュールにより実装されます。(インタフェース・レベルでは、ApplicationModule
がJboExceptionHandler
を実装します。)jbo.client.remote
では、lastEntryInPiggyback
がfalseの場合、この実装は例外を無視します。lastEntryInPiggyback
がtrueの場合、例外がスローされます。
独自のハンドラをインストールするには、アプリケーション・モジュール・インタフェース上の次のメソッドをコールします。
void setExceptionHandler(JboExceptionHandler hndlr);
次に、JboExceptionHandler
インタフェースの独自の実装を渡します。
Copyright © 1997, 2007, Oracle. All rights reserved.