如何用正则匹配未正确记录Throwable的catch代码块?
解决Java项目中未正确记录Throwable的日志代码问题
一、优化正则表达式
你的原正则因使用全局负向预查,导致只要catch块内存在正确日志记录,就会忽略整个块中的错误记录。可以拆分出两个更精准的正则分别匹配两类错误:
1. 匹配未传入异常变量的日志
定位catch块内调用日志方法时,未将捕获到的异常作为参数传入的情况:
catch\s*\(\w+\s+(\w+)\)\s*\{[\s\S]*?Log\s*\.\w+\(\s*(?!.*,\s*\b\1\b\s*\))[^;]+;\s*[\s\S]*?\}
2. 匹配将异常拼接进消息的日志
专门查找把异常对象直接拼接到日志消息字符串中的错误:
catch\s*\(\w+\s+(\w+)\)\s*\{[\s\S]*?Log\s*\.\w+\(\s*["'].*\+\s*\b\1\b\s*["']?[^;]+;\s*[\s\S]*?\}
注意:这类正则仍有局限性,无法处理多行拼接或复杂表达式场景,更推荐使用IntelliJ的结构化工具。
二、使用IntelliJ Structural Search and Replace(SSR)
结构化搜索比正则更适配代码语法,能精准定位错误日志写法:
- 打开SSR:点击菜单栏
Edit > Find > Search Structurally - 点击
+新建模板,输入以下内容(匹配拼接异常的情况):catch ($ExceptionType$ $e$) { $logger$.$logMethod$($message$ + $e$); } - 配置变量约束:
$ExceptionType$:设置为extends Throwable$logMethod$:设置为匹配项目中的日志方法名(如info、error、warn)$logger$:设置为匹配日志类实例(如Log、logger)
- 点击
Find即可定位所有符合该模式的错误日志。
你还可以创建模板匹配未传入异常的情况:
catch ($ExceptionType$ $e$) { $logger$.$logMethod$($message$); }
并添加约束:$message$ 不包含 $e$ 的引用。
三、利用IntelliJ内置代码检查
IntelliJ自带专门的日志检查规则,无需手动编写正则或模板:
- 打开设置:
File > Settings > Editor > Inspections - 展开
Java > Logging,勾选 Incorrect exception logging - 点击
OK后,IntelliJ会自动扫描项目,标记以下错误:- 仅打印异常的
getMessage()而不传递异常对象 - 将异常拼接进日志消息字符串而非作为单独参数传入
- 仅打印异常的
- 右键标记的问题,选择
Show Quick Fix可直接修复为正确的日志写法(如添加异常参数)。
内容的提问来源于stack exchange,提问作者EarthTurtle
相关产品推荐
相关产品推荐

