在异常中使用资源

时间:2013-05-22 12:19:29

标签: android

我有一个使用自定义异常的应用,例如:

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()函数中重写消息时传递“Context”,      - >失败,必须覆盖超级方法,才能像其他所有异常一样工作。

我现在拥有的解决方案:我的应用中的所有活动都有onCreate:

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

非常脏的代码......我不喜欢这个解决方案。那么我的问题是:有没有一种方法可以在没有Context的情况下访问资源?最重要的是,像我这样的应用程序如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

怎么样?
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中显示某些东西,你应该有手头的背景。

答案 1 :(得分:1)

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

你需要一个Context,所以我建议你尽快得到它,并通过静态方法或变量使它可用。你在每个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"
        ...

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