プライマリ・コンテンツに移動
Oracle® Mobile Application Framework Oracle Mobile Application Frameworkでのモバイル・アプリケーションの開発
2.3.3
E82940-01
目次へ移動
目次

前
次

27 MAFアプリケーションでのエラー・メッセージの表示

この章では、AdfExceptionクラスを使用してエラーを呼び出す方法とエラー・メッセージをローカライズする方法について説明します。

この章の内容は次のとおりです。

27.1 MAFアプリケーションでのエラー処理の概要

モバイル・アプリケーションで発生するエラーには、リモート・サーバーへの接続の失敗など、予期できないものがあります。アプリケーションのビジネス・ルールの違反など、予期できるエラーもあります。エラーまたは例外は、プライマリ・リクエスト・スレッド、またはバックグラウンド・タスクを実行するセカンダリ・スレッドで発生する場合があります。アプリケーションで複数の言語がサポートされている場合、エラー・メッセージはユーザーの言語で表示される必要があります。

MAFアプリケーションが例外をスローできるようにするには、oracle.adfmf.framework.exception.AdfExceptionクラスを使用します。詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

次のコードにより、MAFで例外を予期したとおりに処理できるようになります。図27-1に示すようなポップアップ・メッセージがアプリケーション内に表示され、重大度と説明テキストが示されます。

throw new AdfException("My error message", AdfException.ERROR);

図27-1 エラー・メッセージ

この図は周囲のテキストで説明しています

注意:

マネージドBeanまたはデータ・コントロールBean内で例外がスローされると、アプリケーション内に類似のエラー・メッセージが表示されます。

27.2 エラー・メッセージの表示およびバックグラウンド・スレッドの停止

次の例に示すMessageUtilsクラスを使用すると、アプリケーションで最初にJavaScriptコール(invokeContainerJavaScriptFunction)を実行してから例外をスローすることにより、スレッドを停止してエラーを表示することができます。addMessageメソッドを使用すると、エラーが表示可能になります。詳細は、「バックグラウンド・スレッド例外でのアプリケーションによるエラー・メッセージの表示方法」を参照してください。また、「invokeContainerJavaScriptFunction」も参照してください。

MessageUtilsクラスは、BundleFactoryおよびUtilityメソッドを使用してリソース・バンドルとエラー・メッセージを取得し、スレッドがバックグラウンドで実行されているかどうかを動的にチェックします。このクラスを使用して、メイン・スレッドからバックグラウンド・スレッドにコードを移動できます。

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,
                                 null,
                                 null});
         if (AdfException.ERROR.equals(severity)) {
            // need to throw an exception 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 });
   }

}

27.2.1 バックグラウンド・スレッド例外でのアプリケーションによるエラー・メッセージの表示方法

バックグラウンド・スレッドに対して例外がスローされたとき、アプリケーションには例外が表示されません。このような状況でエラー・メッセージを表示できるようにするには、アプリケーションでaddMessageメソッドをコールします。addMessageメソッドは、次のパラメータを取ります。

  • エラーの重大度

  • サマリー・メッセージ

  • 詳細メッセージ

  • clientComponentId

次の例は、addMessageメソッドを使用して、バックグラウンドでエラーが発生したときにアプリケーションがユーザーにアラートを出せるようにする方法を示しています。

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をスローしたするときに使用されるメソッドと同じであるため、エラー・メッセージがメイン・スレッドでの例外を示すものか、バックグラウンド・スレッドに関するものかにかかわらず、ユーザーには同じポップアップ・エラー・メッセージが表示されます。

注意:

前の例に示したとおり、詳細メッセージおよびclientComponentIdNull値にすることができます。詳細メッセージは、サマリー・メッセージと同じフォント・サイズで新しい行に表示されます。

ただし、次の例に示されているように、バックグラウンド・スレッドで実行されるJavaロジック内にコードを配置すると、エラー・メッセージを表示しないようにできます。「エラー・メッセージのローカライズ」の最初の例に示すメソッドを使用すると、ユーザーに通知せずにバックグラウンド・スレッドをサイレントに停止できます。

Runnable runnable = new Runnable() {
   public void run() {
      // this exception will be lost because no popup error
      // message will display in the MAF application
      throw new AdfException("My (lost) error message in background",
                              AdfException.ERROR);
   }
};
Thread thread = new Thread(runnable);
thread.start();

27.3 エラー・メッセージのローカライズ

MAFは、標準Javaリソース・バンドルを使用して、アプリケーション・ユーザーの言語で例外エラー・メッセージを表示します。次の例に示すとおり、リソース・バンドル名(.xlfファイル)およびバンドル・メッセージ・キーが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エラーをスローしないようにするには、oracle.adfmf.util.BundleFactoryメソッドを使用してリソース・バンドルを取得してから、oracle.adfmf.util.Utilityメソッドを使用してエラー・メッセージを取得します(次の例を参照)。

ResourceBundle bundle = BundleFactory.getBundle(XLF_BUNDLE_NAME);
String message = Utility.getResourceString(bundle, "MY_ERROR_MESSAGE",null);
throw new AdfException(message,AdfException.ERROR);

次の例は、adf.mf.api.amx.addMessage JavaScript関数を使用して、バックグラウンド・スレッドから例外がスローされたときにローカライズされたエラー・メッセージを表示する方法を示しています。

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 });