首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >抛出异常Java 8 Lambda

抛出异常Java 8 Lambda
EN

Stack Overflow用户
提问于 2020-02-27 04:22:25
回答 3查看 78关注 0票数 0

我有一个从DB中查找记录并返回一个可选记录的服务,然后取决于记录是否存在,我需要将记录消息推送到kafka,以下是我的代码:

代码语言:javascript
复制
public void process(final String message) throws ProcessorError {
    Optional<User> saved = userService.save(message);    
    saved.ifPresent(theUser -> kafkaProducer.produce(message));
  }

然而,kafkaProducer可能会抛出一个EncryptionError,它是ProcessorError的子类,所以IntelliJ对此并不满意。根据它的建议,我必须将代码更改为:

代码语言:javascript
复制
saved.ifPresent(
        theUser ->
        {
          try {
            kafkaProducer.produce(message);
          } catch (EncryptionError encryptionError) {
            encryptionError.printStackTrace();
          }
        });

但是现在我不想打印stacktrace,我只想重新抛出它,所以我再次将它更改为:

代码语言:javascript
复制
saved.ifPresent(
        theUser ->
        {
          try {
            kafkaProducer.produce(message);
          } catch (EncryptionError encryptionError) {
            throw encryptionError;
          }
        });

然而,IntelliJ又不高兴了,建议我用另一个try/catch来包围那个抛出语句,我怎么才能在没有讨厌的编译器的情况下抛出它呢?

感谢每个人的回复,但我确实需要将其保留为EncryptionError而不是RuntimeException,并且我不喜欢在抛出encryptionError时使用另一次尝试/捕获,我是不是又回到了原来的方式:

代码语言:javascript
复制
if (saved.isPresent()) {
   kafkaProducer.produce(message);
}
EN

回答 3

Stack Overflow用户

发布于 2020-02-27 04:32:52

假设EncryptionError是一个受控异常,你可以将它包装在一个非受控异常中。

代码语言:javascript
复制
saved.ifPresent(
        theUser ->
        {
          try {
            kafkaProducer.produce(message);
          } catch (EncryptionError encryptionError) {
            throw new RuntimeException(encryptionError);
          }
        });
票数 0
EN

Stack Overflow用户

发布于 2020-02-27 04:34:53

我认为EncryptionError是checked exception的一个子类型。所以只需要用RuntimeException包装它,你就完成了。像这样:try { .... } catch (EncryptionError e) { throw new RuntimeException(e.getMessage()); }

票数 0
EN

Stack Overflow用户

发布于 2020-02-27 07:56:44

正如已经提到的,将检查异常包装为未检查异常是可行的,你不需要在签名方法anymore.

  • Lambdas中声明它,
  1. 应该是简短而清晰的。正确的封装是success.
  2. Narrower异常的关键,异常类型是您最好的朋友。throw RuntimeException.

throw MessageProducingException更好

总结一下我上面说的话:

代码语言:javascript
复制
// 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添加另一个抽象级别,并使用更多的缩写producer

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60421970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档