Java错误:在catch块中抛出新异常,原始堆栈跟踪可能丢失

Java错误:在catch块中抛出新异常,原始堆栈跟踪可能丢失,java,exception,pmd,rethrow,Java,Exception,Pmd,Rethrow,在上面的示例中,在粗体行上,我得到了PMD错误,因为“catch块中抛出了新异常,原始堆栈跟踪可能丢失”。我知道这个问题已经被问过很多次了,也有很多在线参考资料。我已经尝试了所有可能的方法。但我仍然无法删除此PMD错误。请让我知道这段代码有什么问题。 提前谢谢 我认为这段代码没有任何问题 但我也不认为PMD会/不应该给出该代码的错误。IIRC,你会发现这样的错误: try { // code which throws exception. } catch (SQLException sq

在上面的示例中,在粗体行上,我得到了PMD错误,因为“catch块中抛出了新异常,原始堆栈跟踪可能丢失”。我知道这个问题已经被问过很多次了,也有很多在线参考资料。我已经尝试了所有可能的方法。但我仍然无法删除此PMD错误。请让我知道这段代码有什么问题。
提前谢谢

我认为这段代码没有任何问题

但我也不认为PMD会/不应该给出该代码的错误。IIRC,你会发现这样的错误:

try {
    // code which throws exception.
} catch (SQLException sqlex) {
    logger.error("Custom message", sqlex);
    **throw new CustomApplicationException("Custom message", sqlex);**
}


您可能有一个旧版本的PMD,或者有人一直在“改进”您正在使用的PMD规则。

代码检查器是发现问题的好工具。然而,在这种情况下,您的代码是好的,PMD可能是过度保护。检查PMD中有关错误的文档,看看是否还有其他需要考虑的问题。然后,如果您仍然对代码感到满意,您可以向其添加//NOPMD标记,以使PMD忽略该行。我不记得这是自动的还是必须配置PMD来查找//NOPMD


请注意,像这样的PMD检查内联异常也不是真正推荐的,当然也不应该被视为最佳实践。但是,对于PMD这样的代码检查器,由于某种原因,偶尔会有一个标志,您希望忽略它。

您使用的是哪种版本的PMD?您可能会看到更新版本中修复的。(该链接仅指向一个固定此类假阳性的位置。可能不止一个。)


根据您使用的Java版本以及在catch块中引发另一个异常的确切方式,确实可能会丢失完整的堆栈跟踪信息。如果您使用的是最新的PMD版本,并且收到此投诉,您可能希望在sourceforge页面上报告PMD错误,然后像其他人所说的那样暂时禁用该投诉的特定实例。

有必要抛出已触发的异常:

try {
    // code which throws exception.
} catch (SQLException sqlex) {
    throw new CustomApplicationException("Custom message");  // no cause!
}
如果要显示特定日志,可以使用记录器:

try {
        // code which throws exception.
    } catch (SQLException sqlex) {
        /* You can show a specific log here (See below) */
        throw sqlex;
    }
如果您使用的是Maven,请在pom.xml中声明:

/* 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 ");

org.slf4j
slf4j简单
1.5.2
假如

我也有同样的问题,我们忽略PMD配置文件中的PMD问题,如下所示

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-simple</artifactId>
                <version>1.5.2</version>
                <scope>provided</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

生产代码的自定义规则集
.*/src/test/java/*
我们使用maven,所以在maven插件中使用了这个配置文件


Ref:

需要修改异常类,如下所示,以保留原始堆栈跟踪

<?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>
CustomApplicationException.java

try {
    // code which throws exception.
} catch (SQLException sqlex) {
    throw new CustomApplicationException("Any Message", sqlex);
}

我认为你是对的。这是一个findbugs错误。堆栈跟踪不会丢失。
public class CustomApplicationException extends RuntimeException {

  public CustomApplicationException() {
  }

  public CustomApplicationException(String message) {
    super(message);
  }

  public CustomApplicationException(String message, Throwable cause) {
    super(message, cause);
  }

}