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