Сонар жалуется на регистрацию и перестройку исключения

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

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

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

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

Ответ 1

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

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

Сонар больше не должен вас беспокоить

Ответ 2

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

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

Ответ 3

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

  • Перейдите в Rule- > Search squid: S1166.
  • Редактировать исключения в профиле качества.
  • Добавить SQLException в список.

Ответ 4

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

Из Oracle docs (Throwable):

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

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

Надеюсь, это поможет. Приветствия.