我试图拦截我的算法在Java中抛出的Exception
,并将文本更改为另一种语言,并将其显示给用户。这可能在java中吗?
对不起我的英文。
答案 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文本国际化工具对该消息进行国际化。