Java 异常处理和日志记录:更好的实践

Java 异常处理和日志记录:更好的实践,java,exception,logging,exception-handling,Java,Exception,Logging,Exception Handling,代码(Java)片段 ..... ..... if ( response.check() == checkNumber ) { String message = "You are looking at Wrong Place"; logger.log( message ); throw new UserAtWrongPlaceException( message ); /* stops here */ } .....

代码(Java)片段

.....
.....
 if ( response.check() == checkNumber )
 { 
        String message = "You are looking at Wrong Place";
        logger.log( message );
        throw new UserAtWrongPlaceException( message ); 
        /* stops here */
 }
 .....
 ...
 if ( response.check() == somethingElse)
 {
 ......
 }
我有代码来检查响应,如果响应等于定义的constatnt checkNumber,我想记录消息并抛出异常,但这样做,我的代码执行将在此时停止,而不是继续

记录我的消息、抛出UserAtErrorPlaceException并继续的更好方法是什么
执行其余代码?

如果要打印堆栈跟踪但不停止执行,可以使用:

new UserAtWrongPlaceException( message ).printStackTrace();

在Java中引发异常总是会停止该方法的执行。它返回到调用该方法的任何代码段,但出现异常。如果该代码捕获到异常,它将转到catch块,否则,它将进一步向上抛出异常

也许您正在寻找将异常附加到日志的方法?伐木工人有一种方法:

logger.log(Level.INFO,message,new UserAtWrongPlaceException(message));
当然,您可以抛出一个随机异常,但如果您希望该方法继续,您必须捕获它:

try {
    if(response.check() == checkNumber) {
        String message = "You are looking at Wrong Place";
        logger.log(message);
        throw new UserAtWrongPlaceException(message);
    }
} catch(UserAtWrongPlaceException e) {
    //Do something with the exception, or just ignore it.
}
但是,当然,您也可以不抛出异常,因为结果是相同的,实例化异常只会减慢它的速度

也许您正在寻找继续使用该方法的方法,但是在最后抛出异常,而不是成功返回。对于这样的实践,我会将例外情况存储到以后(尽管承认非常复杂)。像这样:

UserAtWrongPlaceException exception = null;
if(response.check() == checkNumber) {
    String message = "You are looking at Wrong Place";
    logger.log(message);
    exception = new UserAtWrongPlaceException(message);
}
...
if(response.check() == somethingElse) { ... }
...
if(exception != null) {
    throw exception;
}
return true;
但是,如果您选择了这种模式,那么您必须看看如果多个这样的ifs抛出异常会发生什么。在上面的代码段中,这将导致记录所有异常,但只抛出最后一个异常

记住,方法可以返回,也可以抛出异常。它不能同时做这两件事,也不能抛出多个异常