Java 向错误消息中添加补充信息

Java 向错误消息中添加补充信息,java,generics,exception,Java,Generics,Exception,我曾尝试编写一个方法,该方法接受错误并返回相同的错误,但在消息的末尾添加了一个感叹号,但存在一个问题,即java中的错误是不可变的,并且由于泛型的限制,不可能创建新的错误实例 通过使用新的T(e,message): publicstatict带惊叹号(T错误){ 返回新的T(error.getMessage()+“!”,error); } 有没有不需要反射等的简单解决方案?publicstaticvoidmain(String[]args)抛出异常{ public static void ma

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

publicstatict带惊叹号(T错误){
返回新的T(error.getMessage()+“!”,error);
}
有没有不需要反射等的简单解决方案?

publicstaticvoidmain(String[]args)抛出异常{
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);
}
Throwable t=新的Throwable(“我的消息”); 可丢弃t2=带惊叹号(t); t2.printStackTrace(); } 带有惊叹号标记的公共静态T(T错误) 抛出异常{ 构造函数c=error.getClass().getConstructor(String.class, 可丢弃类); 返回(T)c.newInstance(error.getMessage()+“!”,error); }
如果你想不惜一切代价避免反射,你必须为此付费。提出的解决方案将牺牲
可丢弃类型的精度w.r.t.
。为了在消息中附加一些内容,我们将通过部署构造函数将给定的
Throwable
封装在
异常中

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

您可以通过以下方法实现:


返回
。尽管这将始终返回一个
异常
。耳鼻喉科的感叹号真的那么重要/有用吗?听起来像是一场灾难。反射有什么问题吗?@MauricePerry,因为。我同意选择的答案:在部署反射之前寻找更好的解决方案总是好的。你知道调用此方法时异常的具体类型吗?@Turing85我也同意,但在这种情况下,我看不到其他解决方案。
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);
}
public static <T extends Throwable> Exception withExclamationMark(T t) {
    return new Excpetion(t.getMessage() + "!", t);
}
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 ...
    }
}
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!