【发布时间】:2015-05-04 09:35:44
【问题描述】:
我试图拦截我的算法在 Java 中抛出的Exception,并将文本更改为另一种语言,并将其显示给用户。这在java中可能吗?
对不起,我的英语不好。
【问题讨论】:
-
try-catch 语句..?
标签: java exception translate throw
我试图拦截我的算法在 Java 中抛出的Exception,并将文本更改为另一种语言,并将其显示给用户。这在java中可能吗?
对不起,我的英语不好。
【问题讨论】:
标签: java exception translate throw
您可以捕获一个异常,然后抛出一个相同类型的新异常(或者如果您愿意,可以使用不同的类型)。然后翻译来自原始异常的消息并将其传递给新的异常。类似于以下内容(未测试):
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 文本国际化工具将该消息国际化。
【讨论】: