Ошибка Java: новое исключение выдается в блоке catch, исходная трассировка стека может быть потеряна - PullRequest
3 голосов
/ 21 июня 2011
        try {
            // code which throws exception.
        } catch (SQLException sqlex) {
            logger.error("Custom message", sqlex);
            **throw new CustomApplicationException("Custom message", sqlex);**
        }

В вышеприведенном примере в жирной строке я получаю сообщение об ошибке PMD, поскольку "в блоке перехвата выдается новое исключение, может быть потеряна исходная трассировка стека" Я знаю, что этот вопрос задавался много раз, и есть много онлайн-ссылок на то же самое. Я перепробовал все возможные способы. Но я все еще не могу удалить эту ошибку PMD. Пожалуйста, дайте мне знать, что не так в этом фрагменте кода. Заранее спасибо!

Ответы [ 5 ]

4 голосов
/ 21 июня 2011

Я не думаю, что с этим кодом что-то не так.

Но я также не думаю, что PMD будет / должен выдавать эту ошибку для этого кода.IIRC, вы получаете эту ошибку с чем-то вроде этого:

    try {
        // code which throws exception.
    } catch (SQLException sqlex) {
        throw new CustomApplicationException("Custom message");  // no cause!
    }

Возможно, у вас есть старая версия PMD или кто-то "улучшал" используемые вами правила PMD.

1 голос
/ 21 июня 2011

Проверка кода - отличное решение для выявления проблем. Однако в этом случае ваш код в порядке и PMD, вероятно, чрезмерно защищен. Проверьте документацию в PMD об ошибке и посмотрите, есть ли что-то еще, что вам, возможно, придется рассмотреть. Затем, если вы все еще довольны своим кодом, вы можете добавить к нему тег // NOPMD , чтобы PMD игнорировал строку. Я не могу вспомнить, если это происходит автоматически или вам нужно настроить PMD для поиска //NOPMD.

Обратите внимание, что встроенные исключения для проверок PMD, как это, на самом деле также не рекомендуется и, конечно, не должны рассматриваться как лучшая практика. Но в таких средствах проверки кода, как PMD, будет случайный флаг, который вы по какой-то причине хотите игнорировать.

0 голосов
/ 07 июня 2019

У меня та же проблема, мы игнорируем проблему PMD в файле конфигурации pmd, как показано ниже.

<?xml version="1.0" encoding="UTF-8"?>
<description>Custom Rulesets for production code</description>
<exclude-pattern>.*/src/test/java/.*</exclude-pattern>
<ruleset xmlns="http://pmd.sourceforge.net/ruleset/5.5.3">    
<rule ref="category/java/bestpractices.xml/PreserveStackTrace">
        <exclude name="PreserveStackTrace"/>
    </rule>
</ruleset>

мы используем maven, поэтому использовали этот файл конфигурации в плагине maven

Ссылка: https://pmd.github.io/pmd-6.0.1/pmd_rules_java_bestpractices.html#preservestacktrace

0 голосов
/ 25 января 2017

Необходимо выдать исключение, которое было вызвано:

try {
        // code which throws exception.
    } catch (SQLException sqlex) {
        /* You can show a specific log here (See below) */
        throw sqlex;
    }

Если вы хотите показать определенный журнал, вы можете использовать регистратор:

/* Use this imports */
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
...
/* Declare as global variable */
private Logger logger = LoggerFactory.getLogger(this.getClass());
public Logger getLogger() {
    return logger;
}
public void setLogger(Logger logger) {
    this.logger = logger;
}
/* Use in any place */
logger.error(" an error ");
logger.trace(" operational trace ");
logger.debug(" specific trace for debugging ");

используете Maven, объявите в своем pom.xml:

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-simple</artifactId>
                <version>1.5.2</version>
                <scope>provided</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
0 голосов
/ 21 июня 2011

Какую версию PMD вы используете? Возможно, вы видите ложное срабатывание , исправленное в более новой версии. (Ссылка только на одно место, где исправлен такой ложный положительный результат. Может быть больше одного.)

В зависимости от того, какую версию Java вы используете и как именно вы генерируете другое исключение в блоке перехвата, действительно можно потерять полную информацию трассировки стека. Если вы используете последнюю версию PMD и получаете эту жалобу, вы можете сообщить об ошибке PMD на странице sourceforge, а затем временно отключить этот конкретный экземпляр этой жалобы, как сказали другие.

...