spring抛出异常,通过参数传递给函数java

2nbm6dog  于 2021-07-23  发布在  Java
关注(0)|答案(2)|浏览(377)

我目前正在一个完整的通用场景中工作,在这个场景中,我将json作为字符串Map到dto类。这对我的功能很好 mapJsonToDto 但我正在尝试使它更通用,以便使用此函数的开发人员也可以指定要抛出的异常。所以他们可以随心所欲地抓。这样我就避免了一个例外。让函数处理一切。

public class MapperUtils {
    public <T extends Throwable> Object mapJsonToDto(Class<?> dtoClass, String jsonDto, T exceptionToThrow) throws IOException {
        Object dto = null;
        try {
            dto = new ObjectMapper().readValue(jsonDto, dtoClass);
        } catch (IOException e) {
            throw new exceptionToThrow();
        }
        return dto;
    }
}

我无法理解如何将异常类示例传递给函数并同时抛出该特定类示例。

gzszwxb4

gzszwxb41#

与其将异常传递给throw(这样会有一个完全错误的堆栈跟踪),我认为您需要一个函数来将异常从一种类型转换为另一种类型:

public <T extends Throwable, D> D mapJsonToDto(Class<D> dtoClass, String json, Function<IOException, T> exceptionMapper) throws T {
    try {
        return new ObjectMapper().readValue(json, dtoClass);
        // if readValue doesn't do the casting right, try:
        return dtoClass.cast(new ObjectMapper().readValue(json, dtoClass);
    } catch (IOException e) {
        throw exceptionMapper.apply(e);
    }
}

举个例子:

Person p = mapJsonToDto(Person.class, "{name: \"Joe\"}",
  e -> new IllegalArgumentException("malformed JSON", e));

不过,一般来说,这看起来像是白痴设计。如果您发现ioexception过于通用,那么就不能通过允许调用者提供一个毫无疑问同样过于通用的Map器来手动解决问题。调用者唯一的出路就是深入研究异常,然后写一个if/elseif块(我不知道),其中包含大量的级别,以试图确定真正的问题,例如通过分析各种各样难看的消息。
要么你不关心细节级别,因此应该坚持ioexception(添加代码和无意义的间接层有什么意义?),要么你关心,这还不够好;你应该设计一个更好的错误系统。不过,那不是你的工作,那是 ObjectMapper.readValue 的工作。这就是为什么它抛出的ioexception可能应该被无干扰地发送。

rryofs0p

rryofs0p2#

你的例子差不多完成了。我只将throws类型更改为t并抛出给定的异常。

public <T extends Throwable> Object mapJsonToDto(Class<?> dtoClass, String jsonDto, T exceptionToThrow) throws T {
    Object dto = null;
    try {
        dto = new ObjectMapper().readValue(jsonDto, dtoClass);
    } catch (IOException e) {
        throw exceptionToThrow;
    }
    return dto;
}

电话: mapJsonToDto(String.class, "helo", new IllegalStateException());

相关问题