添加补充信息到错误消息

时间:2018-01-04 14:47:38

标签: java generics exception

我曾尝试编写一个接收错误并返回相同的方法,但在消息末尾添加了感叹号,但是java中的错误是不可变的并且由于局限性而存在问题对于泛型,它不可能创建新的错误实例 通过使用新的T(e,消息):

public static <T extends Throwable> T withExclamationMark(T error) {
    return new T(error.getMessage() + "!", error);
}

是否有任何简单的解决方案不需要反射等?

3 个答案:

答案 0 :(得分:1)

您可以使用BiFunction

执行此操作
public static <T extends Throwable> T withExclamationMark(
        T error, 
        BiFunction<String, T, T> factory) {

    return factory.apply(error.getMessage() + "!", error);
}

然后,您可以按如下方式使用此方法:

RuntimeException original = new RuntimeException("Message");

RuntimeException decorated = withExclamationMark(original, RuntimeException::new);

System.out.println(decorated.getMessage()); // Message!

答案 1 :(得分:0)

public static void main(String[] args) throws Exception {
    Throwable t = new Throwable("my message");
    Throwable t2 = withExclamationMark(t);
    t2.printStackTrace();
}

public static <T extends Throwable> T withExclamationMark(T error) 
             throws Exception {
    Constructor c = error.getClass().getConstructor(String.class, 
                                        Throwable.class);
    return (T) c.newInstance(error.getMessage() + "!", error);
}

答案 2 :(得分:0)

如果您想不惜一切代价避免反思,您将不得不为此付出代价。所提出的解决方案将牺牲精度w.r.t。 Throwable的类型。要在消息中附加内容,我们将通过部署构造函数Exception(String, Throwable)

将给定的Throwable包装在Exception
public static <T extends Throwable> Exception withExclamationMark(T t) {
    return new Excpetion(t.getMessage() + "!", t);
}

正如我已经提到的,此方法仅返回类Exception的实例,因此当您尝试catch这些Exception时,您必须检查cause }:

try {
    ...
} catch (Exception e) { // let's assume you would normally catch an IOException here
    Exception cause = e.getCause();
    if ((cause != null) && (cause instanceof IOException) {
        IOException ioEx = ((IOExcpetion) cause);
        // handle excpetion
    } else {
        throw e; // or System.exit(42) or halt and catch fire or ...
    }
}

有关部署反射的解决方案,请参阅@sanit's answer。也许两种答案的结合可以带来令人满意的解决方案。