Как обрабатывать сообщения об ошибках в цепочке CompletableFutures? - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть длинная цепочка завершаемых фьючерсов в моем проекте, каждый шаг вызывает бэкэнд-API, который может дать несколько сообщений об ошибках и один ответ об успехе.Теперь, после разбора ответа, мне нужно судить, если это ошибка, то мне нужно показать пользователю.Мне также нужно знать, на каком этапе в моей цепочке возникла эта ошибка.

Мой подход (показанный ниже) заключается в том, чтобы генерировать исключительную ситуацию времени выполнения, когда я сталкиваюсь с ошибочным ответом, и затем добавлять исключительно блок в мою цепочку.,Я чувствую, что это не лучший способ сделать это, поскольку исключение времени выполнения не вписывается в этот сценарий.Это также делает мой код уродливым, поскольку я должен делать это всякий раз, когда обрабатываю ответ, что приводит к дополнительной проверке исключений.Есть ли лучший способ сделать это?

CompletableFuture.supplyAsync(() -> {
    //some api call
    Response response = request.send();

    if(response.hasError()){ //this is what I am doing right now
        logger.error("this is error response");
        throw new ResponseErrorException("Error response received for request");
    }
})

Это в основном повторяется для каждого шага в цепочке.

Резюме: Если я получу ответ об ошибке на каком-либо из шагов в цепочке CompletableFuture, каков хороший способ передать его пользователю?

Редактировать: Если нет лучшего подхода, пожалуйста,не стесняйтесь делиться своими взглядами на мой подход.

1 Ответ

0 голосов
/ 09 февраля 2019

Мое предложение - использовать шаблон Декоратор для ответов.Предположим, у вас есть что-то вроде этого

CompletableFuture
.supplyAsync(() -> {
    //some api call
    Response response = request.send();

    if(response.hasError()){ //this is what I am doing right now
        throw new ResponseErrorException("Error response received for request");
    }
})
.thenApply(() -> {
    //some api call
    Response response = request.send();

    if(response.hasError()){ //this is what I am doing right now
        throw new ResponseErrorException("Another Error response received for request");
    }
})
.exceptionally(ex -> "Error: " + ex.getMessage());

, и если вы хотите избежать дублирования в выдаче исключений, вы можете использовать следующий подход

CompletableFuture
.supplyAsync(() -> {
    //some api call
    Response response = ThrowExceptionOnErrorResponse(request.send());
})
.thenApply(() -> {
    //some api call
    Response response = ThrowExceptionOnErrorResponse(request.send());
    }
})
.exceptionally(ex -> "Error: " + ex.getMessage());

class ThrowExceptionOnError implements Response {

    Response originalResponse;

    ThrowExceptionOnError(Response originalResp) {
        if(response.hasError()) {
           throw new ResponseErrorException("Another Error response received for request");
        }
        this.originalResponse = originalResponse;
}
...