首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sonar多维数据集与异常处理机制

Sonar多维数据集与异常处理机制
EN

Stack Overflow用户
提问于 2017-10-11 10:35:31
回答 1查看 2.8K关注 0票数 1

我实现了一些允许在应用服务器上处理套接字连接的功能。下面是我代码的摘录:

代码语言:javascript
复制
@Dependent
public class SocketServerService {

  @Resource(name = "DefaultManagedThreadFactory")
  private ManagedThreadFactory threadFactory;

  private ServerSocket serverSocket;
  private Thread socketServerThread;
  private volatile boolean isListening = false;

  public void startListening(int port) {
     socketServerThread = threadFactory.newThread(() ->   listeningOnSocket(port));
     socketServerThread.setName("ServerSocketThread");
     socketServerThread.start();
  }

  private void listeningOnSocket(int port) {
     try {
         serverSocket = new ServerSocket(port);
         waitForRequestAndProcessData();
     } catch (IOException e) {
         logger.error("Could not listen on socket: " + port, e);
     }
  }

 private void waitForRequestAndProcessData() {
     while (isListening) {
         try {
             final Socket socket = serverSocket.accept();
             process(socket);// do something on data received from socket that 
                             // can throw some checked or unchecked exceptions

          } catch (Exception e) {
             logger.error("Error while processing data.", e);
          }
      }
  } 

  private void stopServerSocket() {
      socketServerThread.interrupt();
  }

...

}

如您所见,我使用ManagedThreadFactory创建可管理线程。当我使用Sonar多维数据集验证我的代码时,它显示了以下错误:

捕获特定异常子类型的列表,而不是.

我知道使用catch (Exception e)处理所有异常都是错误的做法,但我不知道如何修改代码来解决这个问题。当while (isListening) {}方法中出现错误时,我不希望退出process循环(我只希望日志错误并处理套接字中的下一段数据)。但我应该抓住什么样的例外呢?当然,我可以在process方法中声明一些检查过的异常并在waitForRequestAndProcessData方法中捕获它,但是在本例中,我将在process方法中添加catch (Exception e)。在本例中,Sonarcube还将显示捕获特定异常子类型的列表,而不是process方法的消息。也许我该重新设计我的代码了?或者在这种情况下,缓存所有异常不是那么糟糕的做法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-11 10:51:53

ServerSocket.accept()只能引发以下异常:

  • IOException及其子类,这是一个检查异常。
  • 任意数量的RuntimeException及其子类

因此,你可以把你的渔获物替换为:

代码语言:javascript
复制
  } catch (IOException | RuntimeException e) {
     logger.error("Error while processing data.", e);
  }

而且现在可以肯定的是,所有的例外都会被捕获。

您还可以使RuntimeException显式化,这将导致:

代码语言:javascript
复制
  } catch (IOException | SecurityException | IllegalBlockingModeException e) {
     logger.error("Error while processing data.", e);
  }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46686043

复制
相关文章

相似问题

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