web-dev-qa-db-fra.com

Sonar se plaignant de la journalisation et du retour de l'exception

J'ai le morceau de code suivant dans mon programme et j'utilise SonarQube 5 pour vérifier la qualité du code après l'avoir intégré à Maven.

Cependant, Sonar se plaint que je devrais soit enregistrer, soit annuler cette exception.

Qu'est-ce que j'oublie ici? N'ai-je pas déjà enregistré l'exception?

 private boolean authenticate(User user) {
        boolean validUser = false;
        int validUserCount = 0;
        try {
            DataSource dataSource = (DataSource) getServletContext().getAttribute("dataSource");
            validUserCount = new MasterDao(dataSource).getValidUserCount(user);
        } catch (SQLException sqle) {
            LOG.error("Exception while validating user credentials for user with username: " + user.getUsername() + " and pwd:" + user.getPwd());
            LOG.error(sqle.getMessage());
        }
        if (validUserCount == 1) {
            validUser = true;
        }
        return validUser;
    }
15
Nital

Vous devez le faire de cette façon:

try {
    DataSource dataSource = (DataSource) getServletContext().getAttribute("dataSource");
    validUserCount = new MasterDao(dataSource).getValidUserCount(user);
} catch (SQLException sqle) {
    LOG.error("Exception while validating user credentials for user with username: " +
            user.getUsername() + " and pwd:" + user.getPwd(), sqle);
}

Le sonar ne devrait plus vous déranger

33
abarre

Ce que le sonar vous demande de faire, c'est de conserver l'intégralité de l'objet d'exception. Vous pouvez utiliser quelque chose comme:

    try {
        ...         
    } catch (Exception e) {
        logger.error("Error", e);
    }
6
Daniele

Si vous pensez que SQLException peut être ignoré en toute sécurité, vous pouvez l'ajouter à la liste des exceptions pour la règle squid: S1166.

  1. Allez dans Rule-> Search squid: S1166.
  2. Modifiez les exceptions dans Quality Profile.
  3. Ajoutez SQLException à la liste.
3
rbitshift

Je suis tombé sur le même problème. Je ne suis pas sûr à 100% si j'ai complètement raison à ce stade, mais fondamentalement, vous devriez relancer ou enregistrer l'exception complète. Tandis que e.getMessage() vous donne juste le message détaillé mais pas l'instantané de la pile d'exécution.

À partir de Oracle docs (Throwable) :

Un objet jetable contient un instantané de la pile d'exécution de son thread au moment de sa création. Il peut également contenir une chaîne de message qui donne plus d'informations sur l'erreur. Au fil du temps, un objet jetable peut empêcher la propagation d'autres objets jetables. Enfin, le jetable peut également contenir une cause: un autre jetable qui a provoqué sa construction. L'enregistrement de ces informations causales est appelé la fonction d'exception chaînée, car la cause peut, elle-même, avoir une cause, et ainsi de suite, conduisant à une "chaîne" d'exceptions, chacune causée par une autre.

Cela signifie que la solution fournie par abarre fonctionne, car tout l'objet d'exception (sqle) est transmis à l'enregistreur.

J'espère que cela aide. À votre santé.

3
jim