2015-01-24 2 views
10

У меня есть следующий фрагмент кода в моей программе, и я запускаю SonarQube 5 для проверки качества кода после его интеграции с Maven.Sonar жалуется на регистрацию и перестройку исключения

Однако, Сонар жалуется, что я должен Либо регистрировать или отменять это исключение.

Что мне здесь не хватает? Я уже не регистрирую исключение?

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

Может быть, жалуется, что вы входите в сообщение, но не само исключение, которое заставляет вас потерять потенциально полезный трассировки стека исключения. В любом случае, вы должны определенно сделать исключение здесь и сигнализировать о проблеме пользователю, а не делать так, как если бы все шло нормально и возвращалось так же, как если бы учетные данные пользователя были неправильными. Регистрация пароля, безусловно, не очень хорошая идея: серьезная проблема безопасности. –

+1

Вы не регистрируете сообщение и исключение в одном выражении. Поэтому другие записи журнала могут находиться между обоими сообщениями в журнале сервера, скрывая сильное соединение обоих этих сообщений. И может быть исключение, выведенное из первого оператора журнала, скрывающего информацию, содержащуюся во второй. – SpaceTrucker

ответ

25

Вы должны сделать это таким образом:

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 не должно беспокоить вас больше

+0

Спасибо за обновление :) Я проверю это. – user2325154

+1

Что делать, если исключение - это что-то вроде java.util.concurrent.ExecutionException, и вы действительно хотели только зарегистрировать причину. Я вижу комментарий ниже об игнорировании особых исключений! Благодаря! –

+1

Эта жалоба на сонар слишком строгая, на мой взгляд. Есть исключения, которые вы, возможно, ожидаете поймать и проигнорировать, например, «FileNotFoundException» может быть пойман, и сообщение, зарегистрированное с указанием файла, не было найдено, и выполнение будет продолжаться без него - для этого сценария не требуется вся трассировка стека. Тем не менее, нет возможности заставить сонар заткнуться об этом, не пометив линию catch // NOSONAR. –

3

Если вы считаете, что SQLException может быть проигнорировано, то вы можете добавить его в список исключений для кальмара: правило S1166.

  1. Идём в Правило-> Поиск кальмара: S1166.
  2. Редактировать исключения в профиле качества.
  3. Добавить SQLException в список.
+0

Это действительно полезно, особенно в случае обернутых исключений, таких как java.util.concurrent.ExecutionException, где я действительно хочу причину, а не это исключение. –

3

Я наткнулся на эту же проблему. Я не уверен на 100%, если я полностью прав в данный момент, но в основном вы должны реконструировать или зарегистрировать полное исключение. В то время как e.getMessage() просто дает вам подробное сообщение, но не моментальный снимок стека выполнения.

От Oracle docs (Throwable):

Throwable содержит снимки стеки выполнения своей нити в то время он был создан. Он также может содержать строку сообщения, которая дает больше информации об ошибке. Со временем броски могут сдерживать распространение других комбайнов. Наконец, вбрасываемый может также содержать причину: еще один бросок, который заставлял эту брошюру быть сконструированной. Запись этой причинной информации называется связующим средством исключения, поскольку сама причина может иметь причину и т. Д., Что приводит к «цепочке» исключений, каждая из которых вызвана другой.

Это означает, что решение, предоставляемое abarre works, потому что весь объект исключения (sqle) передается в регистратор.

Надеюсь, это поможет. Cheers.

5

Что сонар просит вас сделать, это сохранить весь объект исключения. Вы можете использовать что-то вроде:

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