拦截异常以将其翻译成另一种语言

Intercept Exceptions to Translate it to another language

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

对不起我的英语。

您可以捕获一个异常,然后抛出一个新的相同类型的异常(如果您愿意,也可以抛出不同的类型)。然后翻译来自原始异常的消息并将其传递给新的异常。类似于以下内容(未测试):

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

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

更新 回复评论:

如果您可以修改应用程序(特别是如果应用程序使用从一些基础派生的自定义异常 类),那么您可能能够修改这些以检索已翻译的消息(但如果您可以这样做,您可以从头开始构建翻译后的消息或完整 internationalisation!)。

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

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

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

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

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 ()

只有在报告异常消息文本时才需要翻译异常消息文本。但是 doing that is a mistake.

  • 消息是在抛出异常时创建的。因此,它充其量只能提供非常低级别的信息,这些信息可能不适合向用户报告。
  • 从哲学上讲,使用消息违背了异常的全部要点,即将错误处理的检测和启动(throw 部分)与处理和报告的完成(catch 部分)。使用消息意味着消息必须适合报告,这将报告的责任转移到应该只负责检测和启动的位置。也就是说,我认为 Throwable 设计的 getMessage() 部分是错误的。

不要这样做,而是按照 the advice 选择要在 catch 异常发生时向用户报告的消息。您可以使用常用的 Java 文本国际化工具将该消息国际化。