2017-10-11 95 views
1

我已經實現了一些功能,允許處理應用程序服務器上的套接字連接。這裏是我的代碼摘錄: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方法。也許我應該以某種方式重新設計我的代碼?或者在這種情況下緩存所有異常並不是那麼糟糕的做法?

回答

0

ServerSocket.accept()僅可以拋出以下例外:

  • IOException和亞類的化合物,其是一個檢查異常。

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

    ,仍然現在確保所有異常都會被捕獲:

爲此你任意數量的RuntimeException和子類可以取代你的漁獲物。

您也可以使RuntimeException明確,這將導致:

} catch (IOException | SecurityException | IllegalBlockingModeException e) { 
    logger.error("Error while processing data.", e); 
    }