我已經實現了一些功能,允許處理應用程序服務器上的套接字連接。這裏是我的代碼摘錄:Sonarcube和處理異常機制
@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)
處理所有異常是不好的做法,但我不知道如何更改我的代碼來解決此問題。當我在process
方法(我只想記錄錯誤並處理來自套接字的下一段數據)中發生錯誤時,我不想退出我的while (isListening) {}
循環。但是我應該捕捉哪種類型的異常?當然,我可以在process
方法中聲明一些檢查異常,並在waitForRequestAndProcessData
方法中捕獲它,但在這種情況下,我將在process
方法中添加catch (Exception e)
。在這種情況下,Sonarcube也會顯示 捕獲特定異常子類型的列表,而不是消息爲process
方法。也許我應該以某種方式重新設計我的代碼?或者在這種情況下緩存所有異常並不是那麼糟糕的做法?