我正在使用 Jackson 从 JSON 中反序列化一个 Exception 对象。这是一个简化的演示(使用隐式 delegating creator):
throw new ObjectMapper().readValue("\"custom error message\"", Exception.class);
这有效,但不幸的是,堆栈跟踪包括导致异常实例化的 Jackson 帧:
Exception in thread "main" java.lang.Exception: custom error message
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.fasterxml.jackson.databind.introspect.AnnotatedConstructor.call1(AnnotatedConstructor.java:133)
at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createFromString(StdValueInstantiator.java:332)
at com.fasterxml.jackson.databind.deser.std.StdDeserializer._deserializeFromString(StdDeserializer.java:265)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromString(BeanDeserializerBase.java:1495)
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:197)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:187)
at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4674)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3629)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3597)
有没有办法清理它,让它看起来像是在被抛出的同一行上创建的?
您可以使用
fillInStackTrace()
将堆栈跟踪重置为您抛出的点:
public class Main {
public static void main(String[] args) throws Exception {
Exception e = createException();
e.fillInStackTrace();
throw e;
}
private static Exception createException() {
return new Exception("my message");
}
}
出品:
Exception in thread "main" java.lang.Exception: my message
at org.example.Main.main(Main.java:11)
不调用`fillInStackTrace() 输出是:
Exception in thread "main" java.lang.Exception: my message
at org.example.Main.createException(Main.java:16)
at org.example.Main.main(Main.java:10)