Я пытаюсь сгенерировать исключение внутри лямбда-выражения, но оно продолжает вырабатывать сообщение об ошибке Unhandled IOException.
private <T> T getResponse(final RestURI query, final Class<T> responseClass) throws IOException {
return getValue(query,
reader -> {
try {
return mapper.readValue(reader, responseClass);
} catch (IOException e) {
throw new IOException("Exception while deserializing the output " + e.getMessage());
}
});
}
Может кто-нибудь сказать мне, что я делаю не так?




Функциональный интерфейс, который вы используете в getValue(), не указывает в этой сигнатуре проверенное исключение IOException.
Таким образом, вы не можете выбросить его, поскольку внутри тела лямбда могут быть выброшены только объявленные проверенные исключения.
Либо создайте и используйте свой собственный функциональный интерфейс, объявляющий IOException, либо вместо этого выбросьте любой экземпляр RuntimeException из лямбда-выражения, что является допустимым.
Например, UncheckedIOException, предложенный MC Emperor.
Кроме того, вы должны сгенерировать новое исключение, связав его с исключением причины, чтобы сохранить информацию в stracktrace:
try {
return mapper.readValue(reader, responseClass);
} catch (IOException e) {
throw new UncheckedIOException("Exception while deserializing the output ", e);
}
Или кинуть UncheckedIOException.
Хороший ответ, однако лучше всего, чтобы младший разработчик научился не бросать RuntimeException по умолчанию, потому что ему не хватает ясности. Вы должны расширить RuntimeException и в этом случае назвать его как-то вроде JsonParseException. @MCEmperor также предлагает элегантное решение, если вы не хотите создавать свой собственный класс. Однако предпочитайте классы, специфичные для предметной области.
@Brad Полностью согласен на набор текста. Но JsonParseException уже есть в Джексоне. Фактически OP хочет повторно генерировать любое исключение, созданное ObjectMapper.readValue(), которое фактически генерирует несколько разновидностей IOException: `IOException, JsonParseException, JsonMappingException`. Так что MC Emperor, вероятно, хороший намек для этого варианта использования.
@MC Emperor очень хороший намек.
В любом случае, не создавайте повторно так: укажите
eкак причину нового исключения (если оно вам вообще нужно), чтобы обеспечить трассировку стека фактического исключения.