我正在试图找到一个项目中的日志(log)记录不正确的抛出行.正确用法和不正确用法示例:

// Correct
catch (Exception e)
{
    Log.error(className, "something went wrong", e);
}

// Incorrect, exception not logged
catch (Throwable t)
{
    String errMsg = "something went wrong";
    Log.fatal(className, errMsg);
}

// Incorrect, exception name concatenated instead of providing exception to print stacktrace
catch (IOException exception)
{
    Log.error(className, "Unable to read file " + exception);
}

还显示了异常类型和异常变量名称的变体.

我目前最接近的表情是catch\s*\(\w+\s+(\w+)\)\s*\{[\s\S]*Log\s*\.\w+\(\s*\w+,[\s\S]*(?!,\b\1\b\);)\);.它匹配catch块的开头并捕获用于保存异常的变量名,然后try 找到not以异常变量作为最后一个参数的Log.<level>(行,即, e);.它跳过上面的第一个示例并捕获另外两个.

问题:我在这里测试了表达式https://regexr.com/7p58l,但它遗漏了一个重要的例子:在另一个地方,日志(log)记录是正确的,而正则表达式找不到第一个错误的地方.

catch (Exception e) 
{
    // Regex should capture here, but does not
    Log.error(className, "something something exception");
}

void someMethod() {
    catch (Exception e)
    {
        // Because this line hits the negative lookahead
        Log.error(className, "something something exception", e);
    }
}

我在负面前瞻之后添加字符的所有try 似乎都以某种形式 destruct 了它.需要添加什么才能找到所有不正确的 case ?

这将被放入IntelliJ的全球发现中,所以如果IntelliJ中的工具能更好地工作,将不胜感激

推荐答案

为了实现您的目标,您可以使用正则表达式来确保在CATCH块中不会正确记录异常.关键是要确保,如果CATCH块中有任何日志(log)记录,它就不会正确地记录异常.下面是一个应该适用于您的情况的修改后的正则表达式:

catch\s*\(\w+\s+(\w+)\)\s*\{[\s\S]*?Log\.(?!error\s*\(\s*\w+,\s*"[^"]*",\s*\1\s*\);)[^\r\n;]*;\s*[\s\S]*?\}

Java相关问答推荐

PostgreSQL货币兑换率查询

Java中不同包中的类之间的配置共享

弹簧靴和龙目岛

使用JdkClientHttpRequestFactory通过Spring RestClient和Wiemock读取时达到EOF

使用动态ID从json获取详细信息的Jolt规范

滚动视图&不能在alert 对话框中工作(&Q;&Q;)

Java中的死锁及其重入锁和锁

使用GridBagLayout正确渲染

第二次按下按钮后,我需要将按钮恢复到其原始状态,以便它可以再次工作

在Spring终结点中,是否可以同时以大写和小写形式指定枚举常量?

如何使用带有谓词参数的方法,而不使用lambda表达式

将PNG转换为位图自定义十六进制字符串

没有使用Lombok生成的参数

当构造函数创建一个新实例时,Java为什么需要&new";

视图被推出线性布局-Android

为什么Spring要更改Java版本配置以及如何正确设置?

使用原子整数的共享计数器并发增量

如何显示新布局

SonarQube在合并升级到java17后对旧代码提出错误

睡眠在 Spring Boot 中