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