gpt4 book ai didi

java - jackson 和可怕的 IOException

转载 作者:搜寻专家 更新时间:2023-10-30 21:07:10 25 4
gpt4 key购买 nike

Jackson's ObjectMapper#readValue 成员抛出三个已检查的异常:

IOException 
JsonParseException
JsonMappingException

JsonParseExceptionJsonMappingException 扩展 IOException。我想包装前面提到的两个子类并抛出我自己的自定义异常,但是,正在检查的基类 IOException 要求我也捕获或抛出它。

IOException 抛出到调用层对我来说没有任何意义,但不利的是,如果我隐藏它,它会产生异味。我最初的想法是不捕获它并将其留给调用者/运行时异常机制来处理它......但是,我不想强​​制调用者捕获或指定。

遇到这种情况怎么办?

最佳答案

简短的回答:如果你处理 IO,你就处理 IOException。如果您不处理 IO,则 IOException 应该变成未经检查的异常,因为它们是错误代码的症状。


更长的答案:

readValue 总是采用一个 JsonParser,它可以包裹在 IO 周围(例如文件或 URL)。如果您正在处理 IO,则没有办法绕过处理 IOException,您应该处理它们或以某种方式重新抛出/传递它们。在 IO 期间任何事情都可能发生,您应该准备好处理异常。

但是,如果您确定您的 JsonParser 实例不使用 IO(例如,您使用 JsonFactory#createJsonParser(java.lang.String) 创建一个 JSON字符串上的解析器),您可以假设您收到的任何 IOException 都是错误,无论是在您的代码中还是在 Jackson 中。通常,抛出未经检查的异常是处理它的正确方法:

ObjectMapper om = new ObjectMapper(/* whatever */);
JsonParser jp = JsonFactory.createJsonParser("{ \"foo\": \"bar\" }");
try {
return om.readValue(jp);
} catch (IOException e) {
throw new AssertionError("An IOException occurred when this was assumed to be impossible.");
}

注意:我的 Java 生锈了,而且我从未使用过 Jackson,因此请将上面的代码块视为伪代码。

在任何情况下,您都不需要在throws 中声明AssertionError,因为它们是未经检查的异常。 java.lang.RuntimeExceptionjava.lang.Error 的子类的所有内容都不需要显式捕获或重新抛出。这些异常用于预期不会发生的问题,除非您正在处理错误代码或当您的 VM 主机着火时。

关于java - jackson 和可怕的 IOException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7471216/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com