【发布时间】:2021-07-24 15:04:30
【问题描述】:
TL;dr 版本:(Java)如何检查 catch 子句中未使用的异常变量以避免无意中吞下错误。也许使用 checkstyle 之类的工具(通过 Maven 构建时插件)或使用代码模式。
您经常在代码中编写一个 try/catch 块,您可以在其中捕获内部异常,将其包装在更有意义的异常(链式异常)中,然后向上抛出调用堆栈。
有时,人们往往会忘记链接异常(拼写错误)并在没有根本原因的情况下抛出包装异常。错过这一点显然会导致调试噩梦。有没有办法通过构建时插件(用于 Maven)来检测和警告/错误此类实例?
有效:
try {
...
} catch (IOException e) {
throw new MyException("API failure", e);
}
无效:
try {
...
} catch (IOException e) {
throw new MyException ("API Failure");
}
此外,如果它打算忽略异常,检查器应该能够允许注释以禁用该行的规则,或者可能将变量命名为catch (IOException ignored)。
我知道 checkstyle 有一个空 catch 块的检查器,但上面的场景要广泛得多。未使用的局部变量似乎也无法解决。
是否有可用的检查工具来避免这种常见错误?
一个愚蠢的解决方案可能是让 MyException 的所有构造函数都将 Exception 作为参数(当不需要链接时,显式传递 null )。这感觉不是解决此问题的最佳方法,因此寻找某种检查器...
【问题讨论】:
-
致接近者:为极其具体的用例寻求“推荐”并不是那个“接近”选项的意图。考虑一个问题'我如何启用此检查;如果有帮助,请随意回答您熟悉的任何工具。
-
感谢@rzwitserloot,我添加了“how to”变体作为 tldr,以使具体性更清晰......
-
@rzwitserloot “这不是'关闭'选项的意图”你能指出支持它的文档吗?在近距离投票文本中没有具体说明。
-
我会用 Google 的 Error Prone 来做到这一点。其他工具可用,但这是我最熟悉的。
-
好吧,至少,如果源代码有一个带有
ignored变量的catch和一个SuppressWarnings注释,作为开发人员,我会理解发生了什么;换句话说,我的意图很清楚。
标签: java lint checkstyle