try {
// code which throws exception.
} catch (SQLException sqlex) {
logger.error("Custom message", sqlex);
**throw new CustomApplicationException("Custom message", sqlex);**
}
在上面的例子中,在粗线上,我得到PMD错误为“在catch块中抛出新异常,原始堆栈跟踪可能会丢失”。我知道这个问题已被多次询问,也有很多在线参考资料可用。我已尽力尝试各种方式。但我仍然无法删除此PMD错误。请告诉我这段代码中有什么问题。 提前谢谢!
答案 0 :(得分:4)
我认为该代码没有任何问题。
但我也是,不要认为PMD会/应该为该代码提供错误。 IIRC,你得到这样的错误:
try {
// code which throws exception.
} catch (SQLException sqlex) {
throw new CustomApplicationException("Custom message"); // no cause!
}
您可能拥有旧版本的PMD,或者某人“正在改进”您正在使用的PMD规则。
答案 1 :(得分:2)
需要按如下所述修改异常类以保留原始堆栈跟踪
try {
// code which throws exception.
} catch (SQLException sqlex) {
throw new CustomApplicationException("Any Message", sqlex);
}
CustomApplicationException.java
public class CustomApplicationException extends RuntimeException {
public CustomApplicationException() {
}
public CustomApplicationException(String message) {
super(message);
}
public CustomApplicationException(String message, Throwable cause) {
super(message, cause);
}
}
答案 2 :(得分:1)
代码检查器是解决问题的好方法。但是在这种情况下你的代码很好,PMD可能过于保护。查看PMD中有关错误的文档,看看是否还有其他需要考虑的问题。然后,如果您仍然对代码感到满意,可以向其添加 // NOPMD 标记,以使PMD忽略该行。我不记得这是否是自动的,或者您必须配置PMD以查找// NOPMD。
请注意,这样的PMD检查的内联异常也不是真正推荐的,当然也不应被视为最佳实践。但是对于像PMD这样的代码检查器,偶尔会出现一些你想要忽略的标志。
答案 3 :(得分:0)
您使用的是什么版本的PMD?您可能会看到在较新版本中修复的false positive。 (这个链接只是一个固定了这种假阳性的地方。可能不止一个。)
根据您使用的Java版本以及如何在catch块中抛出另一个Exception,确实可能会丢失完整的堆栈跟踪信息。如果您使用的是最新的PMD版本并且您收到此投诉,您可能希望在sourceforge页面上报告PMD错误,然后暂时禁用该投诉的特定实例,正如其他人所说的那样。
答案 4 :(得分:0)
必须抛出已触发的异常:
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>
答案 5 :(得分:0)
我有同样的问题,我们忽略了如下所示的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插件中使用了此配置文件。
Ref:https://pmd.github.io/pmd-6.0.1/pmd_rules_java_bestpractices.html#preservestacktrace