| Oracle® Enterprise Pack for Eclipse Oracle Mobile Application Framework (OEPE Edition)でのモバイル・アプリケーションの開発 リリース2.0.1 E57593-01 |
|
![]() 前 |
![]() 次 |
この章では、AdfExceptionクラスを使用してエラーを処理する方法およびエラー・メッセージをローカライズする方法について説明します。
この章には次の項が含まれます:
モバイル・アプリケーションで発生するエラーには、リモート・サーバーへの接続失敗などの予想外のエラーと、アプリケーション・ビジネス・ルールの違反などの想定されるエラーがあります。エラーまたは例外は、プライマリ・リクエスト・スレッド、またはバックグラウンド・タスクを実行するセカンダリ・スレッドで発生する場合があります。アプリケーションで複数の言語がサポートされている場合、エラー・メッセージはユーザーの言語で表示される必要があります。
モバイル・アプリケーションが例外をスローできるようにするには、oracle.adfmf.framework.exception.AdfExceptionクラスを使用します。詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。
次のコードを使用すると、MAFで例外を適切に処理することができます。アプリケーション内に、図18-1に示すようなポップアップ・メッセージが表示され、メッセージ重大度および説明テキストが表示されます。
throw new AdfException("My error message",AdfException.ERROR);
|
注意: 管理対象Beanまたはデータ・コントロールBean内で例外がスローされると、アプリケーション内に同様のエラー・メッセージが表示されます。 |
例18-1に示すMessageUtilsクラスを使用すると、アプリケーションで最初にJavaScriptコール(invokeContainerJavaScriptFunction)を実行してから例外をスローすることにより、スレッドを停止してエラーを表示することができます。addMessageメソッドを使用すると、エラーが表示可能になります。詳細は、第18.2.1項「バックグラウンド・スレッド例外におけるアプリケーションによるエラー・メッセージの表示方法」を参照してください。また、第B.2.14項「invokeContainerJavaScriptFunction」も参照してください。
MessageUtilsクラスは、BundleFactoryおよびUtilityメソッドを使用してリソース・バンドルとエラー・メッセージを取得し、スレッドがバックグラウンドで実行されているかどうかを動的にチェックします。このクラスを使用して、メイン・スレッドからバックグラウンド・スレッドにコードを移動できます。
例18-1 MessageUtilsクラス
package oracle.errorhandling.demo.mobile;
import java.util.ResourceBundle;
import oracle.adfmf.framework.api.AdfmfContainerUtilities;
import oracle.adfmf.framework.api.AdfmfJavaUtilities;
import oracle.adfmf.framework.exception.AdfException;
import oracle.adfmf.util.BundleFactory;
import oracle.adfmf.util.Utility;
public class MessageUtils{ public static void handleError(AdfException ex) { handleMessage(ex.getSeverity(), ex.getMessage()); } public static void handleError(String message) { handleMessage(AdfException.ERROR, message); } public static void handleError(Exception ex) { handleMessage(AdfException.ERROR, ex.getLocalizedMessage()); } public static void handleMessage(String severity, String message) { if (AdfmfJavaUtilities.isBackgroundThread()) { AdfmfContainerUtilities.invokeContainerJavaScriptFunction(AdfmfJavaUtilities.
getFeatureName(),
"adf.mf.api.amx.addMessage",
new Object[] {severity, message,
null,
null});
if (AdfException.ERROR.equals(severity)) { // we still need to throw execption to stop background thread processing throw new AdfException(message,severity); } } else { throw new AdfException(message,severity); } }}
public static void addJavaScriptMessage(String severity, String message) {
AdfmfContainerUtilities.invokeContainerJavaScriptFunction(AdfmfJavaUtilities.
getFeatureName(),
"adf.mf.api.amx.addMessage",
new Object[] {severity,
message,
null,
null });
}
}
バックグラウンド・スレッドに対して例外がスローされたとき、アプリケーションには例外が表示されません。このような状況でエラー・メッセージを表示できるようにするには、アプリケーションでaddMessageメソッドをコールします。addMessageメソッドは、次のパラメータを取ります。
エラーの重大度
サマリー・メッセージ
詳細メッセージ
clientComponentId
例18-2は、addMessageメソッドを使用して、バックグラウンドでエラーが発生したときにアプリケーションでユーザーに対してアラートを表示できるようにする方法を示しています。
例18-2 バックグラウンド・スレッドに対するエラー・メッセージを表示可能にする方法
Runnable runnable = new Runnable()
{
public void run()
{
AdfmfContainerUtilities.invokeContainerJavaScriptFunction(AdfmfJavaUtilities.getFeatureName(),
"adf.mf.api.amx.addMessage", new Object[] {AdfException.ERROR,
"My error message for background thread",
null,
null });
}
};
Thread thread = new Thread(runnable);
thread.start();
adf.mf.api.amx.addMessage JavaScript関数は、プライマリ・リクエスト・スレッドでアプリケーションがAdfExceptionをスローしたするときに使用されるメソッドと同じであるため、エラー・メッセージがメイン・スレッドでの例外を示すものか、バックグラウンド・スレッドに関するものかにかかわらず、ユーザーには同じポップアップ・エラー・メッセージが表示されます。
|
注意: 例18-2に示すように、詳細メッセージおよび |
MAFは、標準Javaリソース・バンドルを使用して、アプリケーション・ユーザーの言語で例外エラー・メッセージを表示します。例18-3に示すように、エラー・メッセージをリソース・バンドルから読み取ることができるように、リソース・バンドル名(.xlfファイル)およびバンドル・メッセージ・キーがAdfExceptionコンストラクタ・メソッドに渡されます。
例18-3 リソース・バンドル名およびメッセージ・キーをAdfExceptionコンストラクタ・メソッドに渡す方法
private static final String XLF_BUNDLE_NAME="oracle.errorhandling..mobile.ViewControllerBundle";
throw new AdfException(AdfException.ERROR, XLF_BUNDLE_NAME,
"MY_ERROR_MESSAGE",
null);
アプリケーションがMissingResourceExceptionエラーをスローしないようにするには、例18-4に示すように、oracle.adfmf.util.BundleFactoryメソッドを使用してリソース・バンドルを取得してから、oracle.adfmf.util.Utilityメソッドを使用してエラー・メッセージを取得します。
例18-4 BundleFactoryおよびUtilityメソッドを使用してリソース・バンドルおよびエラー・メッセージを取得する方法
ResourceBundle bundle = BundleFactory.getBundle(XLF_BUNDLE_NAME); String message = Utility.getResourceString(bundle, "MY_ERROR_MESSAGE",null); throw new AdfException(message,AdfException.ERROR);
例18-5は、adf.mf.api.amx.addMessage JavaScript関数を使用して、バックグラウンド・スレッドから例外がスローされたときにローカライズ済エラー・メッセージを表示する方法を示しています。
例18-5 バックグラウンド例外に対するローカライズ済エラー・メソッドの表示方法
ResourceBundle bundle = BundleFactory.getBundle(XLF_BUNDLE_NAME);
String message = Utility.getResourceString(bundle, "MY_ERROR_MESSAGE_BG",null);
AdfmfContainerUtilities.invokeContainerJavaScriptFunction(AdfmfJavaUtilities.
getFeatureName(),
"adf.mf.api.amx.addMessage",
new Object[] {AdfException.ERROR,
message,
null,
null });