拦截例外将其翻译成另一种语言

时间:2015-03-03 16:25:53

标签: java exception translate throw

我试图拦截我的算法在Java中抛出的Exception,并将文本更改为另一种语言,并将其显示给用户。这可能在java中吗?

对不起我的英文。

4 个答案:

答案 0 :(得分:2)

您可以捕获异常,然后抛出相同类型的新异常(如果您愿意,则抛出不同的类型)。然后从原始异常中转换消息并将其传递给新异常。类似于以下内容(未经测试):

try {
  // do something
}
catch (Exception e) {
  throw new Exception(translate(e.getMessage()))
}

public String translate(String message) { /* translation code */ }

更新以回应评论:

如果您可以修改应用程序(特别是如果应用程序使用从几个基类派生的自定义异常),那么您可以修改这些以检索已翻译的消息(但如果您可以这样做,则可以在从一开始就翻译过的消息或完整的internationalisation。)。

可能无法全局拦截和替换所有异常,尽管看起来您至少可以使用调试挂钩全局检测 - 请参阅this answer。可以想象你可以使用反射动态修改Exception消息,但这听起来很讨厌。

最后一种可能性是使用面向方面编程(AOP)来编译抛出异常的代码的额外行为(例如,参见this question)。您需要使用AOP工具重新编译整个应用程序,并且可能仍需要稍微修改应用程序代码。

答案 1 :(得分:0)

我认为你想要Thread.setDefaultUncaughtExceptionHandler() 如果你需要它,这个问题还有更多细节...... swing uncaughtexceptionhandler

答案 2 :(得分:0)

我用这个解决方案解决了我的问题

public class ParamsException extends RuntimeException {
private static final long serialVersionUID = 7161500238672497882L;

public ParamsException() {
    super();
}

public ParamsException(String message) {
    super(new BaseResourcesBusiness().getException(message));
}

public ParamsException(Throwable cause) {
    super(cause);
}

public ParamsException(String message, Throwable cause) {
    super(new BaseResourcesBusiness().getException(message), cause);
}

}

BaseResourceBusiness.getException(message)将XML或数据库中的消息发送到特定语言。所以我的所有例外都是在这种模式下创建的

public static final class NotFoundInDatabaseException extends ParamsException {
    private static final long serialVersionUID = -1595240938885629473L;

    public NotFoundInDatabaseException () {
        super("Not found in database");
    }
}

在使用此模式throw new NotFoundInDatabaseException ()

的代码中

答案 3 :(得分:0)

仅当您正在报告异常的消息文本时,才需要翻译异常的消息文本。但是doing that is a mistake

  • 引发异常时创建消息。因此,它充其量只能提供非常低级的信息,可能不适合向用户报告。
  • 从哲学上讲,使用消息是针对整个异常的,这是将错误处理的检测和启动(throw部分)与处理和报告的完成(catch部分分开) )。使用该消息意味着该消息必须能够很好地进行报告,从而将报告的责任转移到仅应负责检测和启动的位置。也就是说,我认为Throwable设计的getMessage()部分是错误的。

请按照the advice来选择要向您的catch例外情况报告给用户的消息,而不是这样做。您可以使用常规的Java文本国际化工具对该消息进行国际化。