ヘッダーをスキップ

Oracle® Enterprise Pack for Eclipse Oracle Mobile Application Framework (OEPE Edition)でのモバイル・アプリケーションの開発 リリース2.0.1 E57593-01 |
| 目次

前 | 次 |

# 18 MAFアプリケーションのエラー処理

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

この章には次の項が含まれます:

- 第18.1項「MAFでのエラー処理について」

- 第18.3項「エラー・メッセージのローカライズ」

- 第18.2項「エラー・メッセージの表示およびバックグラウンド・スレッドの停止」

## 18.1 MAFでのエラー処理について

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

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

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

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

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

注意: 管理対象Beanまたはデータ・コントロールBean内で例外がスローされると、アプリケーション内に同様のエラー・メッセージが表示されます。

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

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

        }
    }

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

バックグラウンド・スレッドに対して例外がスローされたとき、アプリケーションには例外が表示されません。このような状況でエラー・メッセージを表示できるようにするには、アプリケーションで`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に示すように、詳細メッセージおよび`clientComponentId`は`Null`値である可能性があります。詳細メッセージは、サマリー・メッセージと同じフォント・サイズで新しい行に表示されます。

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

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