выбросить исключение Java 8 лямбда - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть служба, которая ищет запись из БД и возвращает необязательную запись, затем зависит от того, присутствует запись или нет. Мне нужно сделать pu sh сообщение с записью kafka, и вот мой код:

public void process(final String message) throws ProcessorError {
    Optional<User> saved = userService.save(message);    
    saved.ifPresent(theUser -> kafkaProducer.produce(message));
  }

однако kafkaProducer может выдать ошибку EncryptionError, которая является подклассом ProcessorError, поэтому IntelliJ не рад этому. как и предполагалось, мне пришлось изменить код на это:

saved.ifPresent(
        theUser ->
        {
          try {
            kafkaProducer.produce(message);
          } catch (EncryptionError encryptionError) {
            encryptionError.printStackTrace();
          }
        });

, но я не хочу печатать трассировку стека на этом этапе, вместо этого я просто хочу повторно выбросить его, поэтому я изменяю его снова на это:

saved.ifPresent(
        theUser ->
        {
          try {
            kafkaProducer.produce(message);
          } catch (EncryptionError encryptionError) {
            throw encryptionError;
          }
        });

но IntelliJ снова недоволен, предложил мне окружить этот оператор throw еще одним try / catch, как я могу просто бросить его без раздражающего компилятора?

Спасибо всем за ответы, но мне нужно сохранить его как EncryptionError, а не RuntimeException, и мне не нравится окружать throw encryptionError другой попыткой / перехватить, сделать go прежним способом:

if (saved.isPresent()) {
   kafkaProducer.produce(message);
}

Ответы [ 3 ]

0 голосов
/ 26 февраля 2020

Я полагаю, что EncryptionError является подтипом проверяемого исключения. Так что просто оберните его с RuntimeException, и все готово. Как это: try { .... } catch (EncryptionError e) { throw new RuntimeException(e.getMessage()); }

0 голосов
/ 27 февраля 2020
  1. Как уже упоминалось, переход от проверенного исключения к непроверенному - это путь к go, вам больше не нужно объявлять его в методе подписи.

  2. Лямбды предполагают быть короткими и ясными. Правильная инкапсуляция - ключ к успеху.

  3. Более узкие исключения - ваши лучшие друзья. throw MessageProducingException лучше, чем throw RuntimeException.

Подводя итог вышесказанному:

// Getting rid of throws signature
public void process(final String message) {
    userService.save(message)    
         .ifPresent(user -> produceMessage(message);
}

// encapsulated produce method, will deal with exception wrapping
private void produceMessage(Message message) {
     try {
        kafkaProducer.produce(message);
      } catch (EncryptionError encryptionError) {
        // creating and using custom domain-specic exception here, pick up a proper name
        throw new MessageProducingException(encryptionError);
      }
}

Дальнейшим шагом для улучшения может быть добавление еще одного уровня абстракции к ваш kafkaProducer и используйте больше abstact producer вместо.

0 голосов
/ 26 февраля 2020

Предполагая, что EncryptionError является проверенным исключением, вы можете просто заключить его в непроверенное исключение.

saved.ifPresent(
        theUser ->
        {
          try {
            kafkaProducer.produce(message);
          } catch (EncryptionError encryptionError) {
            throw new RuntimeException(encryptionError);
          }
        });
...