首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在异常中使用资源

在异常中使用资源
EN

Stack Overflow用户
提问于 2013-05-22 20:19:29
回答 2查看 710关注 0票数 5

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

代码语言:javascript
复制
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) -->失败,因为这个异常有时是从模型类抛出的,所以它们没有上下文

2)在getMessage()函数中检索消息时传递"Context“,-->失败,需要重写超方法,才能像其他异常一样工作。

我现在有一个解决方案:我的应用程序中的所有活动都有这个onCreate:

代码语言:javascript
复制
public void onCreate(...){
    Utils.RESOURCES = getResources();
    ...
}

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

EN

回答 2

Stack Overflow用户

发布于 2013-05-22 20:48:04

关于

代码语言:javascript
复制
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的情况下发出异常,您应该能够在显示此类错误之前访问context。我不明白为什么你要从构造函数中创建本地化的错误消息。如果需要,您可以登录到logcat而不是本地化版本。当你想要在UI中显示一些东西的时候,你应该手头有上下文。

票数 5
EN

Stack Overflow用户

发布于 2014-01-22 19:47:52

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

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

代码语言:javascript
复制
public class App extends Application {
    private static Resources myResources;

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

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

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

代码语言:javascript
复制
 <application
        android:name="{your_package}.App"
        ...

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16691579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档