2017-10-11 12 views
1

J'ai implémenté certaines fonctionnalités qui permettent de gérer la connexion socket sur le serveur d'applications. Voici un extrait de mon code:Sonarcube et le mécanisme d'exception de gestion

@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(); 
    } 

... 

}

Comme vous pouvez le voir je ManagedThreadFactory pour créer des threads gérables. Lorsque j'ai utilisé Sonarcube pour vérifier mon code, il affiche le bogue suivant:

Attraper une liste de sous-types d'exceptions spécifiques à la place.

Je sais que la gestion de toutes les exceptions en utilisant catch (Exception e) est une mauvaise pratique mais je ne sais pas comment changer mon code pour résoudre ce problème. Je ne veux pas sortir de ma boucle while (isListening) {} quand une erreur se produira dans la méthode process (je veux seulement enregistrer l'erreur et traiter la prochaine donnée de socket). Mais quel type d'exception dois-je attraper? Bien sûr, je peux déclarer une exception vérifiée dans la méthode process et l'attraper dans la méthode waitForRequestAndProcessData mais dans ce cas j'aurai ajouté catch (Exception e) dans la méthode process. Dans ce cas, Sonarcube affichera également Saisissez une liste de sous-types d'exception spécifiques à la place du message pour la méthode process. Peut-être que je devrais redessiner mon code d'une manière ou d'une autre? Ou dans ce cas, la mise en cache de toutes les exceptions n'est pas une si mauvaise pratique?

Répondre

0

ServerSocket.accept() ne peut jeter les exceptions suivantes:

  • IOException et leurs sous-classes qui est une exception vérifiée.
  • Un nombre quelconque de RuntimeException et leurs sous-classes

Pour cela vous pouvez remplacer vos prises avec:

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

et encore maintenant certain que toutes les exceptions seront pris.

Vous pouvez également faire explicitement la RuntimeException et qui se traduirait par:

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