Необработанное исключение работает по-разному на двух разных методах - PullRequest
1 голос
/ 09 июня 2019

Я получил Unhandled exception works differently on two different methods по второму способу getByIds Что не имеет смысла. Я вызываю первый метод во втором методе и уже ставлю try catch.

Есть идеи для этого исключения? Спасибо

@Override
public PostPayload getById(@NotNull UUID issueId) throws APIException {
    try (...) {
        return test.apply(responseIssue, issueAuxiliaryData);
    } catch (IOException e) {
        logger.error("Event='Unable to retrieve XXX ', issueId={}", issueId, e);
        throw new APIException("Unable to retrieve XXX  for issueId=" + issueId, e);
    }
}

@Override
public List<PostPayload> getByIds(@NotNull Set<UUID> issueIds) throws APIException {
    return issueIds.parallelStream()
            .map(issueId ->  {
                try {
                    return this.getById(issueId, channelId, false);
                } catch (IOException | APIException e) {
                    logger.error("Event='Unable to retrieve XXX ', issueId={}", issueId, e);
                    throw new APIException("Unable to retrieve XXX  for issueId=" + issueId, e);

                }
            })
            .filter(Objects::nonNull)
            .collect(Collectors.toList());
}

1 Ответ

3 голосов
/ 09 июня 2019

Вы можете сделать две вещи за исключением:

  1. Как-то справиться
  2. Re- throw it

Ваш первый метод имеет throws APIException в своей подписи, поэтому допустимым является использование APIException.

Но чем это отличается от вашего другого метода? Там вы пытаетесь выбросить исключение из лямбады, переданной методу stream().map() Из документации мы можем узнать функциональный интерфейс, соответствующий этой лямбде:

public interface Function<T, R> {
    R apply(T t);
}

Из подписи видно, что он не генерирует никаких проверенных исключений, поэтому это ошибка компиляции, которая выдает APIException изнутри лямбды (при условии, что APIException является проверенным исключением)

Возможный обходной путь - определить другую версию вашего исключения, которая получается из RuntimeException, например UncheckedApiException. Затем вы можете обернуть всю потоковую операцию в один большой блок try-catch, а в блок catch вы можете выбросить проверенную версию:

@Override
    public List<PostPayload> getByIds(@NotNull Set<UUID> issueIds) throws APIException {
        try {
            return issueIds.parallelStream()
                    .map(issueId -> {
                        try {
                            return this.getById(issueId, channelId, false);
                        } catch (IOException | APIException e) {
                            logger.error("Event='Unable to retrieve XXX ', issueId={}", issueId, e);
                            throw new UncheckedApiException("Unable to retrieve XXX  for issueId=" + issueId, e);

                        }
                    })
                    .filter(Objects::nonNull)
                    .collect(Collectors.toList());
        } catch (UncheckedApiException e) {
            throw new APIException(e);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...