2015-01-24 14 views
10

Ho il seguente codice nel mio programma e sto eseguendo SonarQube 5 per la verifica della qualità del codice su di esso dopo averlo integrato con Maven.Sonar che si lamenta di registrare e rilanciare l'eccezione

Tuttavia, Sonar si lamenta che io dovrei o registrare o riscrivere questa eccezione.

Cosa mi manca qui? Non sto già registrando l'eccezione?

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; 
    } 
+0

forse è lamentarsi che si sta accedendo un messaggio, ma non l'eccezione stessa, che ti fa perdere la potenzialmente utile traccia dello stack dell'eccezione. Ad ogni modo, dovresti assolutamente lanciare un'eccezione qui e segnalare un problema all'utente, piuttosto che fare come se tutto fosse andato normalmente e restituire la stessa cosa come se le credenziali dell'utente fossero errate. Anche la registrazione di una password non è una buona idea: un grosso problema di sicurezza. –

+1

Non si sta registrando un messaggio e l'eccezione in un'unica istruzione. Pertanto, altre voci di registro potrebbero trovarsi tra entrambi i messaggi nel registro del server, nascondendo la forte connessione di entrambi questi messaggi. E potrebbe esserci un'eccezione generata dalla prima istruzione del registro che nasconde le informazioni contenute nel secondo. – SpaceTrucker

risposta

25

si dovrebbe fare in questo modo:

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

Sonar non dovrebbe disturbare più

+0

Grazie per l'aggiornamento :) Lo controllerò. – user2325154

+1

Cosa succede se l'eccezione è qualcosa come java.util.concurrent.ExecutionException e si voleva davvero registrare solo la causa. Vedo un commento qui sotto sull'ignoranza di specifiche eccezioni! Grazie! –

+1

Questa lamentela sonar è troppo severa secondo me. Ci sono eccezioni che potresti aspettarti di catturare e ignorare, ad esempio, 'FileNotFoundException' potrebbe essere catturato e un messaggio registrato che indica che il file non è stato trovato e l'esecuzione continuerà senza di essa - nessuno ha bisogno dell'intera traccia dello stack per questo scenario. Eppure, non c'è modo di far tacere il sonar al di là di etichettare la linea di cattura con // NOSONAR. –

3

Se credi che SQLException può essere ignorato, quindi è possibile aggiungere alla lista di eccezioni per calamaro: regola S1166.

  1. Vai a Regola-> Cerca calamaro: S1166.
  2. Modificare le eccezioni nel profilo di qualità.
  3. Aggiungi SQLException all'elenco.
+0

Questo è veramente utile specialmente nel caso di eccezioni avvolte come java.util.concurrent.ExecutionException, in cui voglio davvero la causa e non questa eccezione stessa. –

3

Mi sono imbattuto nello stesso problema. Non sono sicuro al 100% se ho completamente ragione a questo punto, ma in pratica dovresti rilanciare o registrare l'Eccezione completa. Mentre lo e.getMessage() ti fornisce solo il messaggio dettagliato ma non l'istantanea dello stack di esecuzione.

Dal Oracle docs (Throwable):

Un throwable contiene un'istantanea della pila esecuzione del filo al momento della sua creazione. Può anche contenere una stringa di messaggi che fornisce ulteriori informazioni sull'errore. Col passare del tempo, un lancio può sopprimere altri oggetti da lanciare da propagare. Infine, il lancio può contenere anche una causa: un altro lancio che ha causato la costruzione di questo proiettile. La registrazione di questa informazione causale viene definita come la funzione di eccezione concatenata, poiché la causa può, a sua volta, avere una causa e così via, portando a una "catena" di eccezioni, ciascuna causata da un'altra.

Ciò significa che la soluzione fornita da abarre funziona, poiché l'intero oggetto di eccezione (sqle) viene passato al registratore.

Spero che aiuti. Saluti.

5

Quello che l'ecoscandaglio ti chiede di fare è di mantenere l'intero oggetto di eccezione. Si può usare qualcosa di simile a:

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