我已经实现了一些允许在应用服务器上处理套接字连接的功能。以下是我的代码的摘录:
@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来创建可管理的线程。当我使用Sonarcube验证我的代码时,它显示以下错误:
请抓住特定的例外子类型列表。
我知道使用catch (Exception e)
处理所有异常是不好的做法,但我不知道如何更改代码来解决此问题。当while (isListening) {}
方法发生错误时,我不想退出process
循环(我只想记录日志错误并处理来自套接字的下一段数据)。但是我应该抓到什么类型的例外?当然,我可以在process
方法中声明一些已检查的异常,并在waitForRequestAndProcessData
方法中捕获它,但在这种情况下,我将在catch (Exception e)
方法中添加process
。在这种情况下,Sonarcube也将展示
为process
方法捕获特定异常子类型的列表消息。也许我应该以某种方式重新设计我的代码?或者在这种情况下缓存所有异常并不是那么糟糕的做法?
答案 0 :(得分:0)
ServerSocket.accept()
只能抛出以下异常:
IOException
及其子类,这是一个已检查的例外。RuntimeException
及其子类因此,您可以用以下内容替换您的捕获:
} catch (IOException | RuntimeException e) {
logger.error("Error while processing data.", e);
}
现在仍然可以确保所有异常都会被捕获。
您还可以明确RuntimeException
,这将导致:
} catch (IOException | SecurityException | IllegalBlockingModeException e) {
logger.error("Error while processing data.", e);
}