我有一个使用自定义异常的应用程序,例如:
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 类中抛出,所以它们没有上下文
2) 在getMessage() 函数中获取消息时传递"Context", --> 失败,必须覆盖 super 方法,才能像所有其他异常一样工作。
我现在的解决方案:我应用中的所有 Activity 都有这个 onCreate:
public void onCreate(...){
Utils.RESOURCES = getResources();
...
}
非常脏的代码...我不喜欢这个解决方案。那么我的问题是:有没有办法在没有上下文的情况下访问资源?最重要的是,像我这样的应用程序将如何解决这个问题?
最佳答案
怎么样
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 中显示某些内容的位置,您应该手头有上下文。
关于android - 在异常中使用资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16691579/