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

时间:2013-08-30 00:14:09

标签: 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 */
 }
 .....
 ...
 if ( response.check() == somethingElse)
 {
 ......
 }

我有代码来检查响应,如果响应等于定义的constatnt checkNumber,我想记录消息并抛出异常,但这样做我的代码执行将在此时停止,而不是继续进行。

记录我的消息的更好方法是,抛出UserAtWrongPlaceException并继续         执行其余代码?

2 个答案:

答案 0 :(得分:2)

在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抛出异常会发生什么。在上面的代码片段中,这将导致记录所有异常但仅抛出最后一个异常。

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

答案 1 :(得分:1)

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

new UserAtWrongPlaceException( message ).printStackTrace();