diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/errorprone/AvoidCatchingThrowableRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/errorprone/AvoidCatchingThrowableRule.java index 168c159924..56a4a51049 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/errorprone/AvoidCatchingThrowableRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/errorprone/AvoidCatchingThrowableRule.java @@ -5,8 +5,6 @@ package net.sourceforge.pmd.lang.java.rule.errorprone; import net.sourceforge.pmd.lang.java.ast.ASTCatchStatement; -import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceType; -import net.sourceforge.pmd.lang.java.ast.ASTType; import net.sourceforge.pmd.lang.java.rule.AbstractJavaRule; /** @@ -18,12 +16,12 @@ import net.sourceforge.pmd.lang.java.rule.AbstractJavaRule; public class AvoidCatchingThrowableRule extends AbstractJavaRule { @Override - public Object visit(ASTCatchStatement node, Object data) { - ASTType type = node.getFirstDescendantOfType(ASTType.class); - ASTClassOrInterfaceType name = type.getFirstDescendantOfType(ASTClassOrInterfaceType.class); - if (name.hasImageEqualTo("Throwable")) { - addViolation(data, name); + public Object visit(ASTCatchStatement catchStatement, Object data) { + for (Class caughtException : catchStatement.getCaughtExceptionTypes()) { + if (Throwable.class.equals(caughtException)) { + addViolation(data, catchStatement); + } } - return super.visit(node, data); + return super.visit(catchStatement, data); } } diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/errorprone/xml/AvoidCatchingThrowable.xml b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/errorprone/xml/AvoidCatchingThrowable.xml index 2e9dd79627..a64289f0f4 100644 --- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/errorprone/xml/AvoidCatchingThrowable.xml +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/errorprone/xml/AvoidCatchingThrowable.xml @@ -24,6 +24,23 @@ public class Foo { void foo() { try {} catch (RuntimeException t) {} } +} + ]]> + + + + full class name false-negative test + 1 + 5 +