【问题标题】:Intercept Exceptions to Translate it to another language拦截例外以将其翻译成另一种语言
【发布时间】:2015-05-04 09:35:44
【问题描述】:

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

对不起,我的英语不好。

【问题讨论】:

  • try-catch 语句..?

标签: java exception translate throw


【解决方案1】:

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

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 工具重新编译整个应用程序,并且可能仍需要稍微修改应用程序代码。

【讨论】:

  • 感谢 DNA,但我正在寻找不同的东西,我想拦截我的应用程序在运行时抛出的所有异常并翻译它。我将从 XML 中获取新文本,原始文本是获取它的关键或标签。你明白了吗?
【解决方案2】:

我想你想要 Thread.setDefaultUncaughtExceptionHandler() 如果您需要,此问题有更多详细信息... swing uncaughtexceptionhandler

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2014-11-04
        • 2011-01-04
        • 1970-01-01
        • 1970-01-01
        • 2014-12-27
        • 1970-01-01
        • 2011-05-07
        • 1970-01-01
        • 2012-06-26
        相关资源
        最近更新 更多