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)将“上下文”传递给构造函数,然后执行 ctx.getString(R.string.error_201) --> 失败,因为有时会从模型类中抛出此异常,因此它们没有上下文

2) 在 getMessage() 函数中检索消息时传递“上下文”,--> 失败,必须重写 super 方法,才能像所有其他异常一样工作。

我现在拥有的解决方案:我的应用程序中的所有活动都有这个 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);
    // ...

  }
}

即使有办法以不同的方式访问上下文,你也不应该这样做。如果您需要在无法传递上下文的情况下发出异常,您应该能够在显示此类错误之前访问上下文。我看不出为什么应该从构造函数创建本地化错误消息。如果需要,您可以登录到 logcat 非本地化版本。如果你想在 UI 中显示一些东西,你应该手头有上下文。

于 2013-05-22T12:48:03.533 回答
1

您只能在没有上下文的情况下访问系统范围的资源。

您需要一个上下文,所以我建议您尽快获取它,并通过静态方法或变量使其可用。你在每个 Activity 中都做同样的事情,但是有一个更简洁的方法。您应该创建一个自定义应用程序,并覆盖其 onCreate() 以公开资源:

public class App extends Application {
    private static Resources myResources;

    @Override
    public void onCreate() {
        myResources = getBaseContext().getResources();
        super.onCreate();
    }

    public static Resources getMyResources(){
        return myResources;
    }
}

您必须做的另一件事是在清单中设置应用程序:

 <application
        android:name="{your_package}.App"
        ...

现在,您无需任何准备即可访问所有 Activity 中的资源。您的自定义异常类也可以使用外部化资源。

于 2014-01-22T11:47:52.140 回答