Каков самый чистый / правильный способ обработки пользовательских исключений Future.get () внутри функции callable?(Advanced) - PullRequest
0 голосов
/ 03 октября 2018

Код:

  public void processData(PaymentRequest data) {
    List<Payment> paymentList = new ArrayList<>();
    List<Callable<Payment>> paymentCallables = new ArrayList<>();

    data.getPaymentInfoList().forEach(payment -> paymentCallables.add(() -> payment.execute()));

    try {
      executorService.invokeAll(paymentCallables)
              .stream()
              .map(this::apply)
              .forEach(paymentList::add);
    } catch (InterruptedException exception) {
      throw new ProcessorException("task interrupted when processing", exception);
    }
  }

  private Payment apply(Future<Payment> paymentFuture) {
    try {
      return paymentFuture.get(); //Only shows ExecutuonException
    } catch (InterruptedException | ExecutionException exception) {
      throw new ProcessorException("task interrupted or failed", exception);
    }
  }

Я упустил некоторый код для ясности.

ОБЩАЯ ИНФОРМАЦИЯ

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

Когда выполняется код, и в одном из вызываемых выполнений есть исключение.Исключение брошено; В частности, это исключение происходит в paymentFuture.get ().

ПРОБЛЕМА

У меня есть собственные настраиваемые исключения в payment.execute (),Например, у меня есть исключение проверки в методе payment.execute ().Пример:

public void execute() {
try {
//process
} catch (
throw new ValidationException();
}

ПРОБЛЕМА , когда возникает это исключение и создается исключение ValidationException, это исключение замыкается на ExecutionException.То, что обрабатывается, это ExecutionException.Таким образом, Java оборачивает исключение ExecutionException вокруг моего ValidationExecption.Мне нужен способ обработки и выброса ValidationException из класса, чтобы он мог обрабатываться другим классом GlobalExceptionHandler.

PS: Выполнение:

throw exception.getCause()

не будет работать из-за исключенийНЕОБХОДИМО, чтобы он обрабатывался методом try / catch в методе, и я хотел бы добавить новое исключение, которое может быть перехвачено внешним классом.

Я пытался разобраться в этом часами, поэтому я открыт для всех идей.

1 Ответ

0 голосов
/ 03 октября 2018

Я считаю, что исключения, которые могут быть выброшены из метода payment.execute, могут быть сгруппированы по общему интерфейсу, скажем, PaymentException.

ValidationException будет расширяться PaymentException.

В этом случае вам нужно будет проверить exception.getCause() instanceof PaymentException и повторно вызвать причину, если условие true.

try {
    return paymentFuture.get();
} catch (InterruptedException | ExecutionException exception) {
    final Throwable cause = exception.getCause();
    if (cause instanceof PaymentException) {
       throw (PaymentException) cause;
    }
    throw new ProcessorException("task interrupted or failed", exception);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...