5

次のようなカスタム例外を使用するアプリがあります。

public class SomeException extends Exception{
    private int         iCode;
    private String      iMessage;

    public SomeException(){
        iCode = 201;
        iMessage = **//Get the localized string R.string.error_201??**
    }


    @Override
    public String getMessage() {
        return iMessage;
    }


    @Override
    public int getCode() {
        return iCode;
    }

}

明らかに、エラー メッセージをローカライズしたいと考えています。考えられる解決策はありますが、どれも私を満足させません。

1) "Context" をコンストラクターに渡し、ctx.getString(R.string.error_201) を実行します --> 失敗します。この例外は MODEL クラスからスローされることがあるため、Context はありません。

2) getMessage() 関数でメッセージを取得するときに「コンテキスト」を渡します。 --> 失敗します。他のすべての例外として機能するには、スーパー メソッドをオーバーライドする必要があります。

私が今持っている解決策: 私のアプリのすべてのアクティビティには、この onCreate があります:

public void onCreate(...){
    Utils.RESOURCES = getResources();
    ...
}

非常に汚いコード...私は解決策が好きではありません。私の質問は、コンテキストなしでリソースにアクセスする方法はありますか? そして最も重要なことは、私のようなアプリケーションはこの問題をどのように解決するでしょうか?

4

2 に答える 2

5

どうですか

public class MyException extends Exception {
  private int iCode;

  public MyException(int code) {
    this.iCode = code;
  }

  @Override
  public String getMessage() {
    return "MyException code " + String.valueOf(iCode);
  }

  public String getLocalizedMessage(Context ctx) {
    String message;
    if (iCode == 201)
      message = ctx.getString(R.string.error_201);
    else if (iCode == 202)
      message = ctx.getString(R.string.error_202);
    // ...

  }
}

別の方法でコンテキストにアクセスする方法があったとしても、それを行うべきではありません。Context を渡すことができない例外を発行する必要がある場合は、そのようなエラーを表示する前にコンテキストにアクセスできる必要があります。コンストラクターからローカライズされたエラー メッセージを作成する必要がある理由がわかりません。必要に応じて、ローカライズされていないバージョンの logcat にログを記録できます。また、UI で何かを表示したい場合は、コンテキストが手元にある必要があります。

于 2013-05-22T12:48:03.533 に答える