Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 声纳捕捉器应结合使用_Java_Exception_Sonarqube - Fatal编程技术网

Java 声纳捕捉器应结合使用

Java 声纳捕捉器应结合使用,java,exception,sonarqube,Java,Exception,Sonarqube,让我首先说明,我已经阅读了一些没有涉及我的具体问题的文章 根据需要,渔获量应该结合起来 我测试了我的代码,没有我的异常组合,并且有我的异常组合,但是我得到了一个我没有预料到的行为 以下是我的测试代码: 商业过失 系统例外 例外效用 例外试验(包括主要方法) 当我抛出SystemException而不在同一catch语句中组合BusinessFault和SystemException时,我得到了预期的行为,即调用以下方法 // in ExceptionUtility public stati

让我首先说明,我已经阅读了一些没有涉及我的具体问题的文章

根据需要,渔获量应该结合起来

我测试了我的代码,没有我的异常组合,并且我的异常组合,但是我得到了一个我没有预料到的行为

以下是我的测试代码:

  • 商业过失
  • 系统例外
  • 例外效用
  • 例外试验(包括主要方法)
当我抛出SystemException而不在同一catch语句中组合BusinessFault和SystemException时,我得到了预期的行为,即调用以下方法

// in ExceptionUtility

public static void logException(Logger logger, SystemException se) {
    logger.log(Level.SEVERE, " SYSTEM FAULT THROWN {0}", se.getMessage());
}
控制台输出:

 ::::::::::: throwMyCustomException() : SE
May 12, 2020 19:03:56 AM com.exceptions.ExceptionTester main
SEVERE:  ##### (ExceptionTester) exception caught - msg:   > **** SYSTEM EXCEPTION thrown... ****  
May 12, 2020 19:03:56 AM com.exceptions.ExceptionUtility logException
SEVERE:  SYSTEM FAULT THROWN   > **** SYSTEM EXCEPTION thrown... **** 
但是,当我将BusinessFault和SystemException组合在如下所示的同一个catch语句中并抛出SystemException时,我得到了不同的行为

// in ExceptionTester

try {
    et.throwMyCustomException("SE");
    //et.throwMyCustomException("BF");
} catch (BusinessFault | SystemException e) {  // <<<<<<<< COMBINED EXCEPTIONS
    logger.log(Level.SEVERE, " ##### (ExceptionTester) exception caught - msg: {0} ", e.getMessage());
    ExceptionUtility.logException(logger, e);
} catch (Exception e) {
    ExceptionUtility.logException(logger, e);
}

控制台输出:

 ::::::::::: throwMyCustomException() : SE
May 12, 2020 19:10:30 AM com.exceptions.ExceptionTester main
SEVERE:  ##### (ExceptionTester) exception caught - msg:   > **** SYSTEM EXCEPTION thrown... ****  
May 12, 2020 19:10:30 AM com.exceptions.ExceptionUtility logException
SEVERE:  GENERAL EXCEPTION   > **** SYSTEM EXCEPTION thrown... **** 
我可以看到它仍然是正在传递的SystemException消息。但这并不是我真正需要调用的方法。为了简单起见,我的logExceptions只提供日志信息。但我需要以不同于一般异常的方式处理SystemException和BusinessFault


有谁能稍微解释一下为什么会发生这种行为?更具体地说,为什么在这两种情况下都不调用ExceptionUtility类中处理SystemException的logException方法

该问题是由使用运算符重载引起的

SonarQube认为两个catch语句的主体是相同的。而且,天真的是,他们看起来确实如此。文本是相同的。问题在于,周围catch块的上下文决定了将选择哪个签名,以及如何解释该文本。当您组合catch块时,将选择generic
Exception
重载,而不是更具体的版本之一。这会以一种不受欢迎的方式改变你的行为

看来SonarQube不够成熟,无法做出区分

我看到两种解决方案:

  • 将SonarQube错误标记为假阳性。这是完全正确的,因为SonarQube在这种情况下是错误的。但是,您的代码的未来读者可能会犯与SonarQube相同的错误,并且可能会尝试合并这些块。您可以添加一个测试用例,以确保这样的更改不会被忽略
  • 更改方法名称,使您不再依赖运算符重载,以便SonarQube可以判断catch块是不同的
  • 例如:

    public static void logBusinessException(Logger logger, BusinessFault bf) {
         logger.log(Level.SEVERE, " BUSINESS FAULT THROWN {0}", bf.getMessage());
    }
    
    public static void logSystemException(Logger logger, SystemException se) {
        logger.log(Level.SEVERE, " SYSTEM FAULT THROWN {0}", se.getMessage());
    }
    
    public static void logException(Logger logger, Exception e) {
        logger.log(Level.SEVERE, " GENERAL EXCEPTION {0}", e.getMessage());
    }
    


    该问题是由使用运算符重载引起的

    SonarQube认为两个catch语句的主体是相同的。而且,天真的是,他们看起来确实如此。文本是相同的。问题在于,周围catch块的上下文决定了将选择哪个签名,以及如何解释该文本。当您组合catch块时,将选择generic
    Exception
    重载,而不是更具体的版本之一。这会以一种不受欢迎的方式改变你的行为

    看来SonarQube不够成熟,无法做出区分

    我看到两种解决方案:

  • 将SonarQube错误标记为假阳性。这是完全正确的,因为SonarQube在这种情况下是错误的。但是,您的代码的未来读者可能会犯与SonarQube相同的错误,并且可能会尝试合并这些块。您可以添加一个测试用例,以确保这样的更改不会被忽略
  • 更改方法名称,使您不再依赖运算符重载,以便SonarQube可以判断catch块是不同的
  • 例如:

    public static void logBusinessException(Logger logger, BusinessFault bf) {
         logger.log(Level.SEVERE, " BUSINESS FAULT THROWN {0}", bf.getMessage());
    }
    
    public static void logSystemException(Logger logger, SystemException se) {
        logger.log(Level.SEVERE, " SYSTEM FAULT THROWN {0}", se.getMessage());
    }
    
    public static void logException(Logger logger, Exception e) {
        logger.log(Level.SEVERE, " GENERAL EXCEPTION {0}", e.getMessage());
    }
    


    非常感谢!我确认您提出的解决方案有效。非常感谢!我确认你提出的解决方案有效。
    // in ExceptionTester
    
    try {
        et.throwMyCustomException("SE");
        //et.throwMyCustomException("BF");
    } catch (BusinessFault | SystemException e) {  // <<<<<<<< COMBINED EXCEPTIONS
        logger.log(Level.SEVERE, " ##### (ExceptionTester) exception caught - msg: {0} ", e.getMessage());
        ExceptionUtility.logException(logger, e);
    } catch (Exception e) {
        ExceptionUtility.logException(logger, e);
    }
    
    
    // in ExceptionUtility
    
    public static void logException(Logger logger, Exception e) {
        logger.log(Level.SEVERE, " GENERAL EXCEPTION {0}", e.getMessage());
    }
    
    
     ::::::::::: throwMyCustomException() : SE
    May 12, 2020 19:10:30 AM com.exceptions.ExceptionTester main
    SEVERE:  ##### (ExceptionTester) exception caught - msg:   > **** SYSTEM EXCEPTION thrown... ****  
    May 12, 2020 19:10:30 AM com.exceptions.ExceptionUtility logException
    SEVERE:  GENERAL EXCEPTION   > **** SYSTEM EXCEPTION thrown... **** 
    
    public static void logBusinessException(Logger logger, BusinessFault bf) {
         logger.log(Level.SEVERE, " BUSINESS FAULT THROWN {0}", bf.getMessage());
    }
    
    public static void logSystemException(Logger logger, SystemException se) {
        logger.log(Level.SEVERE, " SYSTEM FAULT THROWN {0}", se.getMessage());
    }
    
    public static void logException(Logger logger, Exception e) {
        logger.log(Level.SEVERE, " GENERAL EXCEPTION {0}", e.getMessage());
    }